keyword = models.BooleanField(default=True, verbose_name='关键字回复开关')

This commit is contained in:
AKW 2023-12-20 17:50:07 +08:00
parent ca57c36756
commit 059e56e5ce
28 changed files with 574 additions and 5 deletions

View File

@ -50,8 +50,7 @@ class JqrHookUser(models.Model):
time_qun = models.BooleanField(default=True, verbose_name='定时群聊开关')
time_private = models.BooleanField(default=True, verbose_name='定时私聊开关')
time_quan = models.BooleanField(default=True, verbose_name='定时朋友圈开关')
hook_time = models.DateTimeField(
null=True, blank=True, verbose_name='hook时间')
keyword = models.BooleanField(default=True, verbose_name='关键字回复开关')
utime = models.DateTimeField(verbose_name='更新时间', null=True, blank=True)
name = models.CharField(
max_length=255, verbose_name='用户名', null=True, blank=True)
@ -69,6 +68,9 @@ class JqrHookUser(models.Model):
verbose_name='对外展示信息', null=True, blank=True)
qrcode = models.CharField(
max_length=255, verbose_name='二维码', null=True, blank=True)
hook_starttime = models.DateTimeField(null=True, verbose_name="hook最近一次启动时间", blank=True)
hook_wstime = models.DateTimeField(null=True, verbose_name="hook最近一次websocket首发消息时间", blank=True)
hook_connecttime = models.DateTimeField(null=True, verbose_name="hook最近一次通信时间", blank=True)
class Meta:
unique_together = ('corpid', 'userid', 'vid')

View File

@ -2,9 +2,11 @@ import base64
from rest_framework import serializers
from apps.jqr.models import JqrHookUser
from apps.jqr.tasks import save_add_contact, delete_add_contact, edit_add_contact
from libs.weworkapi.callback.WXBizMsgCrypt3 import WXBizMsgCrypt, Prpcrypt
from utils.tools import sha1_encoder, get_attribute, camel_to_snake
from utils.base_serializer import BaseSerializer
import xml.etree.cElementTree as ET
@ -153,3 +155,11 @@ class WechatEncryptSerializer(serializers.Serializer):
"""
print('客户群解散事件')
print(data)
class HeartBeatSerializer(BaseSerializer):
HookStartData = serializers.DateTimeField(source='')
class Meta:
model = JqrHookUser
fields = '__all__'

View File

@ -40,9 +40,12 @@ def save_add_contact(data, corpinfo, *args, **kwargs):
qrcodeid = data.get('qrcodeid')
if qrcodeid:
check_qrcode.delay(qrcodeid, userid, corpinfo)
tag_remark_contact.delay(qrcodeid, userid, externaluserid, corpinfo)
alarm_userid_by_qrcodeid.delay(qrcodeid)
edit_add_contact.delay(data, corpinfo, *args, **kwargs)
# 打标签备注
tag_remark_contact(qrcodeid, userid, externaluserid, corpinfo)
# 修复客户关系
edit_add_contact(data, corpinfo, *args, **kwargs)
# TODO 请求API 发送消息
@shared_task(name='edit_add_contact', queue='contact')

View File

@ -3,5 +3,6 @@ from . import views
router = SimpleRouter(trailing_slash=False)
router.register('event', views.WechatWorkerViewSet, basename='wechat-worker')
router.register('hook/client', views.HookClientController, basename='hook-client')
urlpatterns = router.urls

View File

@ -8,6 +8,7 @@ from apps.jqr.parsers import WechatContentParser
from apps.jqr.renderers import WechatPublicContentRenderer
from apps.jqr.serializers import WechatPublicTokenSerializer, WechatEncryptSerializer
from apps.qc.models import QcCorpinfo
from utils.base_viewsets import BaseViewSet
class WechatWorkerViewSet(viewsets.GenericViewSet):
@ -61,3 +62,16 @@ class WechatWorkerViewSet(viewsets.GenericViewSet):
if self.request.method == 'POST':
return [WechatPublicContentRenderer()]
return super().get_renderers()
class HookClientController(BaseViewSet):
permission_classes = []
authentication_classes = []
@action(methods=['post'], detail=False, url_path='heartbeat')
def heartbeat(self, request, *args, **kwargs):
pass
@action(methods=['post'], detail=False, url_path='pushmsg')
def pushmsg(self, request, *args, **kwargs):
pass

0
apps/system/__init__.py Normal file
View File

3
apps/system/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
apps/system/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class SystemConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.system'

76
apps/system/choices.py Normal file
View File

@ -0,0 +1,76 @@
from django.db import models
class PaymentType(models.IntegerChoices):
YFD = 1, '云发单'
JFJC = 2, '接粉检测'
ALIVE_ACTIVITY_PAGE = 3, '活动单页(活)'
DEAD_ACTIVITY_PAGE = 4, '活动单页(死)'
class PaymentActivityType(models.IntegerChoices):
ELM = 1, 'elm'
ALIPAY = 2, '支付宝'
COMPLAINT_PAGE = 3, '投诉页'
class ActivityType(models.IntegerChoices):
ELM = 1, 'elm赏金'
ALIPAY = 2, '支付宝'
COMPLAINT_PAGE = 3, '投诉页'
MIDDLE_PAGE = 4, '中间页'
class ActivityLinkType(models.IntegerChoices):
DEAD = 0, '死链接'
ALIVE = 1, '活链接'
class AuthorizationPlatformType(models.IntegerChoices):
# ALIPAY = 1, '支付宝'
ELM = 2, '饿了么'
MT = 3, '美团'
TB = 4, '淘宝'
PDD = 5, '拼多多'
JD = 6, '京东'
class AuthorizationType(models.IntegerChoices):
COOKIE = 1, '插件模拟登录'
APP_SECRET = 2, 'app_secret'
AUTHORIZATION = 3, '账号授权'
class DomainBusinessType(models.IntegerChoices):
SHORT_CHAIN = 1, '短链'
LANDING_PAGE = 2, '落地页'
QUICK_CODE = 3, '快码'
class DomainType(models.IntegerChoices):
QUICK_CODE = 1, '快码'
SELF_BIND = 2, '自己绑定'
QUICK_STATION = 3, '快站'
class QuickCodeCreateMethodType(models.IntegerChoices):
PROGRAM = 1, '程序生成'
MANUAL = 2, '人工生成'
MANUAL_COPY = 3, '手动复制'
class QuickCodeType(models.IntegerChoices):
OFFICIAL = 1, '官方'
PRIVATE = 2, '自己'
class AuthorizationCookieCheckResultChoices(models.IntegerChoices):
FAIL = 0, '检测失败'
SUCCESS = 1, '检测成功'
class DbEnum(models.TextChoices):
XBTOOL = 'xbtool', '小程序工具'
HDY = 'hdy', '活动页'
QWHM = 'qwhm', '企微活码'
QWJQR = 'qwjqr', '企微机器人'

View File

240
apps/system/models.py Normal file
View File

@ -0,0 +1,240 @@
import uuid
from .choices import *
from apps.user.models import User
class PaymentRecord(models.Model):
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='payment_records')
pay_type = models.IntegerField(
choices=PaymentType.choices, verbose_name="付费类型")
activity_type = models.IntegerField(
choices=PaymentActivityType.choices, verbose_name="活动类型")
pay_amount = models.IntegerField(verbose_name="付费金额")
pay_time = models.DateTimeField(verbose_name="付费时间")
expire_time = models.DateTimeField(verbose_name="到期时间")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
db_table = "py_payment_record"
verbose_name = "付费记录"
verbose_name_plural = verbose_name
ordering = ['-create_time']
class Activity(models.Model):
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='activities',
db_index=True)
template = models.ForeignKey('Activity',
on_delete=models.DO_NOTHING, verbose_name="模板", db_constraint=False,
related_name='children', null=True, blank=True)
title = models.CharField(max_length=100, verbose_name="标题")
remark = models.TextField(verbose_name="备注", null=True, blank=True)
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
pv = models.IntegerField(verbose_name="pv", default=0)
# business_domain = models.ForeignKey('Domain', to_field='domain', db_constraint=False, on_delete=models.DO_NOTHING,
# verbose_name='业务域名', related_name='business_activities', null=True,
# blank=True,
# db_column='business_domain')
# short_chain_domain = models.ForeignKey('Domain', to_field='domain', db_constraint=False,
# on_delete=models.DO_NOTHING, null=True, blank=True,
# verbose_name='短链域名', related_name='short_chain_activities',
# db_column='short_chain_domain')
domain = models.ForeignKey('Domain', db_constraint=False, on_delete=models.DO_NOTHING,
verbose_name='业务域名', related_name='activities', null=True, blank=True)
business_domain = models.CharField(
max_length=100, verbose_name="业务域名", null=True, blank=True)
short_chain_domain = models.CharField(
max_length=100, verbose_name="短链域名", null=True, blank=True)
activity_type = models.IntegerField(choices=ActivityType.choices,
verbose_name="活动类型")
link_type = models.IntegerField(choices=ActivityLinkType.choices,
verbose_name="链接类型")
is_top = models.BooleanField(default=False, verbose_name="是否置顶")
create_json = models.JSONField(
verbose_name="创建json", null=True, blank=True)
request_json = models.JSONField(
verbose_name="请求json", null=True, blank=True)
response_json = models.JSONField(
verbose_name="响应json", null=True, blank=True)
platform_id = models.IntegerField(
verbose_name="平台id", null=True, blank=True)
is_quick_code = models.BooleanField(default=False, verbose_name="是否是快码")
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
corpid = models.CharField(max_length=32, verbose_name="企业微信corpid", null=True, blank=True)
externaluserid = models.CharField(
max_length=32, verbose_name="外部联系人id", null=True, blank=True)
tklexpiretime = models.DateTimeField(
verbose_name="淘口令过期时间", null=True, blank=True)
class Meta:
db_table = 'py_activity'
verbose_name = '活动表'
ordering = ['-create_time']
def add_activity_history(self):
activity_history = ActivityHistory()
activity_history.activity = self
for field in self._meta.fields:
if field.name in ['id']:
continue
if hasattr(activity_history, field.name):
setattr(activity_history, field.name, getattr(self, field.name))
activity_history.save()
class ActivityHistory(models.Model):
activity = models.ForeignKey('Activity',
on_delete=models.DO_NOTHING, verbose_name="活动", db_constraint=False,
related_name='history')
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='history_activities',
db_index=True)
template = models.ForeignKey('Activity',
on_delete=models.DO_NOTHING, verbose_name="模板", db_constraint=False,
related_name='history_templates', null=True, blank=True)
title = models.CharField(max_length=100, verbose_name="标题")
remark = models.TextField(verbose_name="备注", null=True, blank=True)
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
pv = models.IntegerField(verbose_name="pv", default=0)
domain = models.ForeignKey('Domain', db_constraint=False, on_delete=models.DO_NOTHING,
verbose_name='业务域名', related_name='history_activities', null=True, blank=True)
business_domain = models.CharField(
max_length=100, verbose_name="业务域名", null=True, blank=True)
short_chain_domain = models.CharField(
max_length=100, verbose_name="短链域名", null=True, blank=True)
activity_type = models.IntegerField(choices=ActivityType.choices,
verbose_name="活动类型")
link_type = models.IntegerField(choices=ActivityLinkType.choices,
verbose_name="链接类型")
is_top = models.BooleanField(default=False, verbose_name="是否置顶")
create_json = models.JSONField(
verbose_name="创建json", null=True, blank=True)
request_json = models.JSONField(
verbose_name="请求json", null=True, blank=True)
response_json = models.JSONField(
verbose_name="响应json", null=True, blank=True)
platform_id = models.IntegerField(
verbose_name="平台id", null=True, blank=True)
is_quick_code = models.BooleanField(default=False, verbose_name="是否是快码")
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
class Meta:
db_table = 'py_activity_history'
verbose_name = '历史表'
ordering = ['-create_time']
class Domain(models.Model):
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='domains',
db_index=True
)
domain = models.CharField(
max_length=100, verbose_name="域名", null=True, blank=True)
business_type = models.IntegerField(
verbose_name="业务类型", choices=DomainBusinessType.choices)
is_system = models.BooleanField(verbose_name="是否是系统", default=False)
domain_type = models.IntegerField(
verbose_name="域名类型", choices=DomainType.choices)
app_key = models.CharField(
max_length=100, verbose_name="app_key", null=True, blank=True)
secret = models.CharField(
max_length=100, verbose_name="secret", null=True, blank=True)
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
db_table = 'py_domain'
verbose_name = '域名表'
ordering = ['-create_time']
class Authorization(models.Model):
name = models.CharField(max_length=100, verbose_name="名称")
remark = models.TextField(verbose_name="备注", blank=True, null=True)
cookie_key = models.CharField(
verbose_name="cookie key", max_length=32, null=True, blank=True, default=lambda: uuid.uuid4().hex)
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False, related_name='authorizations',
db_index=True)
platform_type = models.IntegerField(
verbose_name="平台类型", choices=AuthorizationPlatformType.choices)
uid = models.CharField(
max_length=100, verbose_name="平台uid", null=True, blank=True)
# authorization_type = models.IntegerField(
# verbose_name="授权类型", choices=AuthorizationType.choices)
account = models.CharField(
max_length=100, verbose_name="账号", null=True, blank=True)
password = models.CharField(
max_length=100, verbose_name="密码", null=True, blank=True)
app_key_secret_info = models.JSONField(
null=True, blank=True, verbose_name="app_key_secret授权信息")
cookie_info = models.JSONField(
null=True, blank=True, verbose_name="cookie授权信息")
auth_info = models.JSONField(null=True, blank=True, verbose_name="授权信息")
is_delete = models.BooleanField(default=False, verbose_name="是否删除")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
cookie_update_time = models.DateTimeField(
null=True, blank=True, verbose_name="cookie更新时间")
auth_update_time = models.DateTimeField(
null=True, blank=True, verbose_name="授权更新时间")
app_key_secret_update_time = models.DateTimeField(
null=True, blank=True, verbose_name="授权更新时间")
cookie_warning_setting = models.IntegerField(verbose_name='cookie报警设置', null=True, blank=True)
cookie_check_result = models.IntegerField(verbose_name='cookie检测结果', null=True, blank=True,
choices=AuthorizationCookieCheckResultChoices.choices)
cookie_check_time = models.DateTimeField(verbose_name='cookie检测时间', null=True, blank=True)
class Meta:
db_table = 'py_authorization'
verbose_name = '授权表'
ordering = ['-create_time']
class ComplaintPageRecord(models.Model):
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False,
related_name='complaint_page_records', db_index=True)
activity = models.ForeignKey('Activity', on_delete=models.DO_NOTHING,
verbose_name="活动", db_constraint=False, related_name='complaint_page_records',
db_index=True)
info = models.JSONField(null=True, blank=True, verbose_name="投诉信息")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
db_table = 'py_complaint_page_record'
verbose_name = '投诉页记录'
ordering = ['-create_time']
class QuickCode(models.Model):
user = models.ForeignKey(
User, on_delete=models.DO_NOTHING, verbose_name="用户", db_constraint=False,
related_name='quick_codes', db_index=True)
activity = models.ForeignKey('Activity', on_delete=models.DO_NOTHING,
verbose_name="活动", db_constraint=False, related_name='quick_codes',
db_index=True)
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
create_method = models.IntegerField(
choices=QuickCodeCreateMethodType.choices, default=QuickCodeCreateMethodType.MANUAL, verbose_name="创建方式")
quick_code_url = models.CharField(
max_length=255, null=True, blank=True, verbose_name="快码url")
converted_url = models.CharField(
max_length=255, null=True, blank=True, verbose_name="被转链url")
quick_code_type = models.IntegerField(
choices=QuickCodeType.choices, default=QuickCodeType.OFFICIAL, verbose_name="快码类型")
class Meta:
db_table = 'py_quick_code'
verbose_name = '快码记录'
ordering = ['-create_time']

View File

0
apps/system/tasks.py Normal file
View File

0
apps/system/tests.py Normal file
View File

6
apps/system/urls.py Normal file
View File

@ -0,0 +1,6 @@
from rest_framework.routers import SimpleRouter
from . import views
router = SimpleRouter(trailing_slash=False)
urlpatterns = router.urls

155
apps/system/utils.py Normal file
View File

@ -0,0 +1,155 @@
import requests
from django.conf import settings
from apps.system.choices import ActivityType, AuthorizationPlatformType, QuickCodeCreateMethodType, QuickCodeType, \
DbEnum
from django.core.files.storage import default_storage
from datetime import date, datetime
from apps.system.models import Authorization, Activity, QuickCode
from libs.kz import KZ
from libs.topsdk.top import TopUtils
from utils.exceptions import CustomProjectException
from utils.tools import InviteCode
from yzk.settings.constant import MiddlePageConstant
def get_alipay_link_by_bid(bid):
return settings.ALIPAY_ACTIVITY_LINK.format(bid)
def get_response_json_by_activity(activity):
activity_type = activity.activity_type
request_json = activity.request_json
data = None
if activity_type == ActivityType.ELM:
authorization_id = request_json.get('authorization_id')
authorization = Authorization.objects.get(
pk=authorization_id, platform_type=AuthorizationPlatformType.ELM)
app_key_secret_info = authorization.app_key_secret_info
appkey = app_key_secret_info.get('appkey')
secret = app_key_secret_info.get('secret')
pid = request_json.get('pid')
sid = request_json.get('sid')
activity_id = request_json.get(
'activity_id', MiddlePageConstant.ELM_ACTIVITY_ID)
top_utils = TopUtils(appkey, secret)
response_json = top_utils.get_official_activity(
pid, activity_id, sid=sid)
activity.response_json = response_json
activity.save()
data = {
'kl': response_json.get('link').get('eleme_word'),
'l': response_json.get('link').get('h5_url'),
'r': activity.title,
}
elif activity_type == ActivityType.ALIPAY:
bid = request_json.get('bid')
data = {
'link': get_alipay_link_by_bid(bid)
}
activity.response_json = data
activity.save()
return data
def get_activity_by_short_chain_key(short_chain_key, select_user=False):
activity_id = InviteCode.decode(short_chain_key)
queryset = Activity.objects.filter(id=activity_id, is_delete=False)
if select_user:
queryset = queryset.select_related('user')
activity = queryset.first()
return activity
def create_quick_code(instance, link, domain=None, create_method=QuickCodeCreateMethodType.PROGRAM):
domain = domain or instance.domain
if domain is None:
return None, None
app_key = domain.app_key
secret = domain.secret
success, quick_code_link = KZ(
appkey=app_key, secret=secret).gen_short_link(link, domain=domain)
if not success:
raise CustomProjectException(detail=quick_code_link)
quick_code = None
if quick_code_link:
quick_code = QuickCode.objects.create(
user=instance.user,
activity=instance,
quick_code_url=quick_code_link,
converted_url=link,
create_method=create_method,
quick_code_type=QuickCodeType.PRIVATE if domain.user_id > 0 else QuickCodeType.OFFICIAL
)
return quick_code_link, quick_code
def save_files(files, business=None, return_path=False, user_id=0):
data = []
folder = business or DbEnum.HDY
for file in files:
fs = default_storage
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
file_name = f'{folder}/{user_id}/{timestamp}_{file.name}'
fs.save(file_name, file)
file_url = fs.url(file_name)
if return_path:
data.append({
'path': file_name,
'url': file_url,
})
else:
data.append(f'{file_url}')
return data
def test_authorization(instance: Authorization, field):
field_info = getattr(instance, field)
if not field_info:
return False
platform_type = instance.platform_type
success = False
if platform_type == AuthorizationPlatformType.ELM:
if field == 'cookie_info':
cookies = []
xsrf_token = ''
for info in field_info:
cookie = f'{info.get("name")}={info.get("value")}'
cookies.append(cookie)
if info.get('name') == 'XSRF-TOKEN':
xsrf_token = info.get('value')
cookie = ';'.join(cookies)
url = f'https://union.ele.me/user/userinfo?_csrf={xsrf_token}'
headers = {
'Cookie': cookie,
'X-Csrf-Token': xsrf_token,
'X-Xsrf-Token': xsrf_token,
}
res = requests.get(url, headers=headers).json()
success = res.get('success') and str(res.get('result', {}).get('userId')) == instance.uid
if field == 'app_key_secret_info':
appkey = field_info.get('appkey')
secret = field_info.get('secret')
top_util = TopUtils(appkey=appkey, secret=secret)
res = top_util.get_zone_list()
success = res is not None
elif platform_type == AuthorizationPlatformType.MT:
if field == 'cookie_info':
cookies = []
for info in field_info:
cookie = f'{info.get("name")}={info.get("value")}'
cookies.append(cookie)
cookie = ';'.join(cookies)
headers = {
'Cookie': cookie,
}
url = f'https://union.meituan.com/api/account/info'
res = requests.get(url, headers=headers)
if res.status_code < 400:
res = res.json()
success = res.get('status') == 0 and str(res.get('data', {}).get('uid')) == instance.uid
if field == 'cookie_info':
instance.cookie_check_result = int(success)
instance.cookie_check_time = datetime.now()
instance.save()
return success

0
apps/system/views.py Normal file
View File

0
apps/user/__init__.py Normal file
View File

3
apps/user/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
apps/user/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class UserConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.user'

9
apps/user/choices.py Normal file
View File

@ -0,0 +1,9 @@
from django.db import models
class UserAccountTypeChoices(models.IntegerChoices):
"""
用户账号类型
"""
NORMAL = 1, '普通用户'
ADMIN = 2, '管理员'

View File

29
apps/user/models.py Normal file
View File

@ -0,0 +1,29 @@
import uuid
from .choices import *
class User(models.Model):
username = models.CharField(max_length=50, verbose_name='用户名', unique=True)
nick_name = models.CharField(
max_length=50, verbose_name='昵称', null=True, blank=True)
password = models.CharField(max_length=255, verbose_name='密码')
mobile = models.CharField(max_length=20, verbose_name='手机号', unique=True)
desc = models.TextField(null=True, blank=True, verbose_name='简介')
account_type = models.IntegerField(
default=UserAccountTypeChoices.NORMAL, verbose_name='账号类型')
avatar = models.URLField(
default='https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640', verbose_name='头像')
home_path = models.CharField(
max_length=50, verbose_name='登录后跳转的页面', default='/qc/rule')
app_secret = models.CharField(default=lambda: uuid.uuid4().hex, editable=False, unique=True, max_length=32,
verbose_name='app_secret')
is_active = models.BooleanField(default=True, verbose_name='是否激活')
last_login = models.DateTimeField(
null=True, blank=True, verbose_name='上次登录时间')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='创建时间')
class Meta:
db_table = 'pb_user'
verbose_name = '用户'

0
apps/user/serializers.py Normal file
View File

0
apps/user/tests.py Normal file
View File

6
apps/user/urls.py Normal file
View File

@ -0,0 +1,6 @@
from rest_framework.routers import SimpleRouter
from . import views
router = SimpleRouter(trailing_slash=False)
urlpatterns = router.urls

0
apps/user/views.py Normal file
View File

View File

@ -33,7 +33,7 @@ THIRD_PARTY_APPS = [
"rest_framework",
]
LOCAL_APPS = ["apps.jqr", "apps.qc", "apps.warning"]
LOCAL_APPS = ["apps.jqr", "apps.qc", "apps.warning", "apps.user", "apps.system"]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS