需求: 记录用户习惯
用户查看下一个图表时, 希望能记住自己当前的习惯配置. 比如你在B站看视频调低了音量, 打开下一个视频 音量应该和上一次相同. 需要被记录的习惯项目有5个: 是否显示网格线, 图例 etc. …
分析
需要传一个config字典, 保存用户习惯, (这样就可以不止5个, 多少个习惯, 习惯的种类, 这些是前端的事)
代码
code/core/models.py
class Account(models.Model):
###
config = models.JSONField(verbose_name="用户配置", default=dict)
在数据库中添加一列 然后migration
code/core_api/views/v2/project_member.py
class AccountViewSet(BaseViewSet):
"""工作区用户接口"""
###
@schema_decorator(
{
"config": Validation(DictValidator(), "配置", optional=True),
}
)
@action(methods=["post", "get"], detail=True, url_path="habit")
def habit(self, request, pk):
account = request.user
if request.method == "GET": # 前端获取用户配置习惯
return APIResponse(account.config)
# 前端更新用户配置习惯
account.config = self.validated_data.get("config", {})
account.save()
return APIResponse(account.config)
需求: 最近搜索
调用recommender类的member_last_question方法, 实现"最近搜索"接口.
代码
code/core_api/views/v3/project_member.py
@action(methods=["get"], detail=True, url_path="last-questions")
@project_member_required
@schema_decorator(
{
"count": Validation(IntValidator(), "count", optional=True),
}
)
def last_questions(self, request, pk):
"""最近搜索"""
words = []
question = Question3(
self.project_config,
words,
fuzzy=True,
fuzzy_min_length=1,
homonym=True,
homonym_min_length=1,
)
recommender = Recommender(
self.member,
question,
self.project_config,
)
result = recommender.member_last_questions(self.validated_data.get("count"))
return APIResponse(result)
注:
这个写得有点问题, 最后没被merge
需求: 审计日志
审计日志: 需要在所有涉及对敏感数据的修改查询操作的接口打log (安全审计, 如果没有的话 没法中标)
分析
涉及文件:
code/core_audit/models.py
这个文件的定义了EventLog
类(models其实是Django对数据库操作的封装), 该类定义了审计日志应该记录的内容.
from django.db import models
from core_audit.constants import EventTrigger, EventType
class EventLog(models.Model):
created_at = models.DateTimeField(auto_now_add=True, verbose_name="发生时间")
name = models.IntegerField(choices=EventType.choices(), verbose_name="事件类型")
trigger = models.IntegerField(choices=EventTrigger.choices(), verbose_name="触发来源")
content = models.JSONField(null=True, verbose_name="事件详情")
client_id = models.IntegerField(null=True, verbose_name="客户ID")
account_uid = models.UUIDField(null=True, verbose_name="用户UID")
source_ip = models.GenericIPAddressField(null=True, verbose_name="请求IP地址")
err_code = models.CharField(null=True, max_length=32, verbose_name="状态码")
err_message = models.CharField(null=True, max_length=255, verbose_name="事件错误信息")
version = models.IntegerField(verbose_name="版本")
class Meta:
indexes = [
models.Index(fields=["client_id", "created_at", "account_uid"]),
]
code/core_audit/commands.py
这个文件里定义了一些函数
下面是涉及敏感操作接口的文件
code/core_api/views/v2/project_admin
code/core_api/views/v2/client_admin
code/core_openapi/views/v1/account.py
代码
需求: 忽略大小写
关键词搜索忽略大小写
代码
code/core_api/views/v2/project_member.py
# 有查询词根据查询词过滤
if q := self.validated_data.get("q"):
for name in measure[ConfProp.NAMES]:
if q in name: #删
if q.lower() in name.lower(): #增
names.append(name)
break
else:
code/core_project/commands/dimension.py
if not attr.get(ConfProp.IS_KEYWORD):
# 本身名称包含有搜索词,添加
for name in attr[ConfProp.NAMES]:
if word in name: #删
if word.lower() in name.lower(): #增
result.children.append(DimensionTreeNode(name, attr_prop))
break
# 是关键词
###
if not keywords.exists():
# 判断名称是否包含
for name in attr[ConfProp.NAMES]:
if word in name: #删
if word.lower() in name.lower(): #增
result.children.append(DimensionTreeNode(name, attr_prop))
break
# 有对应的关键词
###
result.children.append(dimension_node)
else:
for name in dimension[ConfProp.NAMES]:
if word in name: #删
if word.lower() in name.lower(): #增
result.children.append(DimensionTreeNode(name, dimension_prop))
break
需求: 处理历史报错
背景:
make run_web
启动服务,网页能正常启动,但最开始会报hana_ml.dataframe - ERROR - ModuleNotFoundError: No module named 'shapely'
的信息。现在需要处理掉这条信息。经查是某个文件引用的hana_ml.dataframe中,引用了shapely这个包,但这个包其实可有可无,因为这个dataframe.py中引用这个包的地方是这么写的:
try:
from shapely import wkt
except ImportError as error:
logging.getLogger(__name__).error("%s: %s", error.__class__.__name__, str(error))
把except下面那行注释掉以后,就没有报错了。但这只解决了本地的问题。
解决:
执行pipenv install shapely
,会在Pipfile
文件中增加一条依赖。注意依赖要锁版本,按字典序排序。