校园集市小程序开发-系统架构与Django后端

news/2024/11/16 23:55:12/文章来源:https://www.cnblogs.com/sherioc/p/18351805

引子: 烂尾就烂尾吧,大不了以后自己创业。唉,也算给自己一个警戒。

E-R模型

接口设计

数据模型设计

基本模型放在models.py中

class School(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=100, verbose_name='学校名称')
# 学校校区
class SchoolRegion(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=100, verbose_name='校区名称')school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='regions', verbose_name='所属学校')def __str__(self):return f"{self.school.name} {self.name}"# 用户
class CustomUser(models.Model):wechat_openid = models.CharField(max_length=255, unique=True, verbose_name='微信OpenID', null=True, blank=True)id = models.BigAutoField(primary_key=True, editable=False)phone = models.CharField(max_length=11, unique=True, verbose_name='手机号')gender = models.CharField(max_length=10, choices=(('male', '男'), ('female', '女'),('unknow','未知')), verbose_name='性别')avatar = models.URLField(verbose_name='头像URL')nickname = models.CharField(max_length=50, verbose_name='昵称')signature = models.CharField(null=True, blank=True, max_length=200, verbose_name='个性签名')email = models.EmailField(null=True, blank=True, unique=True, verbose_name='邮箱')birthday = models.DateField(null=True, blank=True, verbose_name='生日')height = models.IntegerField(null=True, blank=True, verbose_name='身高')background_image = models.URLField(null=True, blank=True, verbose_name='背景图URL')hometown = models.CharField(null=True, blank=True, max_length=50, verbose_name='家乡')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')is_verified = models.BooleanField(default=False, verbose_name='是否通过认证')is_frozen = models.BooleanField(default=False, verbose_name='是否冻结')school = models.ForeignKey('School', on_delete=models.CASCADE, related_name='students', verbose_name='所在学校', null=True, blank=True)region = models.ForeignKey('SchoolRegion', on_delete=models.CASCADE, related_name='students', verbose_name='所在校区', null=True, blank=True)like_number = models.IntegerField(default=0, verbose_name='点赞数')fan_number = models.IntegerField(default=0, verbose_name='粉丝数') # 用户被关注follow_number = models.IntegerField(default=0, verbose_name='关注数') # 用户关注数def __str__(self):return self.nickname# 圈子
class Circle(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=100, verbose_name='圈子名称')description = models.TextField(verbose_name='圈子描述')avatar = models.URLField(verbose_name='圈子头像URL')notice = models.TextField(null=True, blank=True, verbose_name='圈子公告')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')is_verified = models.BooleanField(default=False, verbose_name='是否通过认证')is_frozen = models.BooleanField(default=False, verbose_name='是否冻结')creator = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='circles', verbose_name='创建者')school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='circles', verbose_name='所属学校')like_number = models.IntegerField(default=0, verbose_name='点赞数')collect_number = models.IntegerField(default=0, verbose_name='收藏数')fan_number = models.IntegerField(default=0, verbose_name='粉丝数')def __str__(self):return f"{self.name} (创建者:{self.creator.nickname})"# 帖子
class Post(models.Model):id = models.BigAutoField(primary_key=True)title = models.CharField(max_length=200, verbose_name='标题') content = models.TextField(verbose_name='内容')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')is_frozen = models.BooleanField(default=False, verbose_name='是否冻结')circle = models.ForeignKey(Circle, on_delete=models.CASCADE, related_name='posts', verbose_name='所属圈子')author = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='posts', verbose_name='作者')like_number = models.IntegerField(default=0, verbose_name='点赞数')collect_number = models.IntegerField(default=0, verbose_name='收藏数')comment_number = models.IntegerField(default=0, verbose_name='评论数')def __str__(self):return f"{self.author.nickname}发布的{self.title}"# 评论
class Comment(models.Model):id = models.BigAutoField(primary_key=True)content = models.TextField(verbose_name='评论内容')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', verbose_name='所属帖子')reply_to = models.ForeignKey('self', on_delete=models.SET_NULL,  related_name='replies', verbose_name='回复目标', null=True, blank=True)author = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='comments', verbose_name='作者')like_number = models.IntegerField(default=0, verbose_name='点赞数')reply_number = models.IntegerField(default=0, verbose_name='回复数')def __str__(self):return f"{self.author.nickname}的{self.content}"def delete(self, *args, **kwargs):# 当删除一个评论时,将指向它的所有回复评论的reply_to字段设置为NULLif self.reply_to:self.reply_to.replies.update(reply_to=None)super().delete(*args, **kwargs)# 通知
class Notification(models.Model):id = models.BigAutoField(primary_key=True)sender = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='sent_notifications', verbose_name='事件发送者')receiver = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='notifications', verbose_name='接收用户')content = models.TextField(verbose_name='通知内容', null=True, blank=True)status = models.BooleanField(default=False, verbose_name='状态')  # True 表示已读,False 表示未读created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')# 上传的图片
class Image(models.Model):id = models.BigAutoField(primary_key=True)image = models.CharField(max_length=255, verbose_name='图片url')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')uploader = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='images', verbose_name='上传者')

关系模型另外放在relations.py

"""帖子图片"""
class PostImage(models.Model):post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post_images')image = models.ForeignKey(Image, on_delete=models.CASCADE, related_name='post_images')# 额外排序字段order = models.PositiveIntegerField(default=0)class Meta:# 确保图片的顺序是按照升序排列的ordering = ['order']# 确保不会有重复的帖子-图片对unique_together = ('post', 'image')"""用户举报(帖子、圈子、评论、用户)"""
class Report(models.Model):id = models.BigAutoField(primary_key=True)report_type = models.CharField(max_length=50, choices=[('post', '帖子'), ('circle', '圈子'), ('comment', '评论'), ('user', '用户')], verbose_name='举报类型')reason = models.TextField(verbose_name='举报理由', null=True, blank=True)status = models.CharField(max_length=50, choices=[('pending', '待处理'), ('approved', '已批准'), ('rejected', '已拒绝')], default='pending', verbose_name='举报状态')created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')reporter = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='reports', verbose_name='举报者')reported_object = models.ForeignKey(Post if report_type == 'post' else Circle if report_type == 'circle' else Comment if report_type == 'comment' else CustomUser, on_delete=models.CASCADE, related_name='reporters', verbose_name='被举报对象')def __str__(self):if self.report_type == 'post':return f"{self.reporter.nickname}:id({self.reporter.id})举报了帖子{self.reported_object.title}:id({self.reported_object.id})"elif self.report_type == 'circle':return f"{self.reporter.nickname}:id({self.reporter.id})举报了{self.reported_object.name}:id({self.reported_object.id})"elif self.report_type == 'comment':return f"{self.reporter.nickname}:id({self.reporter.id})举报了{self.reported_object.content}:id({self.reported_object.id})"elif self.report_type == 'user':return f"{self.reporter.nickname}:id({self.reporter.id})举报了用户{self.reported_object.nickname}:id({self.reported_object.id})""""用户点赞(帖子、评论、圈子、用户)"""
class UserLikePost(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='liked_posts')post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='likers')created_at = models.DateTimeField(auto_now_add=True, verbose_name='点赞时间')class Meta:unique_together = ('user', 'post')def __str__(self):return f"{self.user.nickname} 点赞了 {self.post.title}"class UserLikeComment(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='liked_comments')comment = models.ForeignKey(Comment, on_delete=models.CASCADE, related_name='likers')created_at = models.DateTimeField(auto_now_add=True, verbose_name='点赞时间')class Meta:unique_together = ('user', 'comment')def __str__(self):return f"{self.user.nickname} 点赞了 {self.comment.content}"class UserLikeCircle(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='liked_circles')circle = models.ForeignKey(Circle, on_delete=models.CASCADE, related_name='likers')created_at = models.DateTimeField(auto_now_add=True, verbose_name='点赞时间')class Meta:unique_together = ('user', 'circle')def __str__(self):return f"{self.user.nickname} 点赞了 {self.circle.name}"class UserLikeUser(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='liked_users')liked_user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='likers')created_at = models.DateTimeField(auto_now_add=True, verbose_name='点赞时间')class Meta:unique_together = ('user', 'liked_user')def __str__(self):return f"{self.user.nickname} 点赞了 {self.liked_user.nickname}""""用户收藏(帖子、圈子、评论)"""
class UserCollectPost(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='collected_posts')post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='collecters')created_at = models.DateTimeField(auto_now_add=True, verbose_name='收藏时间')class Meta:unique_together = ('user', 'post')def __str__(self):return f"{self.user.nickname} 收藏了 {self.post.title}"class UserCollectCircle(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='collected_circles')circle = models.ForeignKey(Circle, on_delete=models.CASCADE, related_name='collecters')created_at = models.DateTimeField(auto_now_add=True, verbose_name='收藏时间')class Meta:unique_together = ('user', 'circle')def __str__(self):return f"{self.user.nickname} 收藏了 {self.circle.name}"class UserCollectComment(models.Model):user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='collected_comments')comment = models.ForeignKey(Comment, on_delete=models.CASCADE, related_name='collecters')created_at = models.DateTimeField(auto_now_add=True, verbose_name='收藏时间')class Meta:unique_together = ('user', 'comment')def __str__(self):return f"{self.user.nickname} 收藏了 {self.comment.content}""""用户关注(用户、圈子)"""
class UserFollowUser(models.Model):follower = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='following_users')following = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='followers')created_at = models.DateTimeField(auto_now_add=True, verbose_name='关注时间')class Meta:unique_together = ('follower', 'following')  # 确保关注关系是唯一的,防止重复关注def __str__(self):return f"{self.follower.nickname} 关注 {self.following.nickname}"class UserFollowCircle(models.Model):follower = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='following_circles')following = models.ForeignKey(Circle, on_delete=models.CASCADE, related_name='followers')created_at = models.DateTimeField(auto_now_add=True, verbose_name='关注时间')class Meta:unique_together = ('follower', 'following')def __str__(self):return f"{self.follower.nickname} 关注 {self.following.name}"

前端响应模型设计

对前端响应模型进行封装,resfront.py

异常处理配置中间件

CMarket/app/middleware.py

CMarket/cmarket/settings.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780571.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真

1.课题概述基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真,包括PV模型建模(不使用simulink自带的PV模块,根据公式进行建模),MPPT最大功率控制器,PI控制器,锁相环,逆变器等等。输出系统的收敛曲线。2.系统仿真结果 上面三个波形分别表示光伏并网输出的Ipv,Upv和…

如何选择最适合你的免费项目管理软件

国内外主流的10款免费项目管理软件对比:PingCode、Worktile、Teambition、Tower、Tapd、Asana、Trello、Wrike、Basecamp、ClickUp、Monday.com。在众多项目管理工具中,找到一个既免费又能满足你专业需求的软件似乎是一项挑战。市场上免费和付费工具琳琅满目,但很多小型团队…

limu|P8-9|线性回归、softmax回归

线性回归模型:\(y = Xw + b + \epsilon\) 1、如何衡量模型质量?loss function损失函数——量化实际值和预测值之间的差距 可证:在高斯噪声的假设下,线性模型的最大似然估计 等价于 最小化均方误差(MSE)。证明在另一篇里写过:https://www.cnblogs.com/xjl-ultrasound/p/1…

学习笔记-图灵完备、图灵机与Brainfuck

前言 本文是近日对图灵完备的学习所做的笔记,如有错误还请指正. 本文包含以下内容: 1.什么是图灵机?什么是图灵完备?什么是Brianfuck? 2.对图灵机的简单模拟. 3.使用Brianfuck模拟一个简单的图灵机. 图灵机? Alan Mathison Turing在1937年提出了一个通用计算设备的猜想.他猜…

帝国cms怎么整站迁移

帝国CMS整站迁移指南第一步:备份数据使用帝国CMS自带的备份功能,对网站数据进行完整备份,包括数据库、目录和文件。第二步:导入新数据库在新的服务器上,创建一个新的数据库,并导入之前备份的数据库。第三步:修改配置文件和数据库连接参数修改 config/config.php 和 data…

织梦dedecms怎么上传本地视频

如何使用 Dedecms 上传本地视频步骤 1:准备视频文件确保视频文件格式符合 Dedecms 支持的格式(例如 MP4、FLV、AVI)。 确定视频文件的存储位置,最好保存在本地电脑上。 步骤 2:打开 Dedecms 管理后台输入管理员账号密码登录 Dedecms 管理后台。 步骤 3:创建新的视频分类在…

帝国cms数据库如何批量替换字段值

UPDATE phome_ecms_news_data_1 SET newstext=REPLACE(newstext,原来,现在) 说明:phome_ecms_news_data_1为数据表名,可以改为任意数据表名,newstext为批量替换的字段。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CS…

大小核溯源:parallelism 和 heterogeneity

ETH Computer Architecture Fall 2023 [1]课程笔记从 parallelism 到 heterogeneity Parallelism 加速的本质来自 Admals Law 和 Polloacks Rule。理想 N 核体系相比单核加速比遵守 \(s = \frac{1}{p+\frac{1-p}{N}}\), 但一味增加并行计算能力不仅边缘递减反而还会 degradati…

地铁站点客流量预测:随机森林极限梯度提升回归器XGBoost

全文链接: https://tecdat.cn/?p=37308 原文出处:拓端数据部落公众号 分析师:Xinyi He 随着城市化进程的加快,地铁作为城市公共交通的重要组成部分,其客流量管理与预测对于城市交通规划和资源配置具有重要意义。准确的客流量预测不仅有助于提高地铁运营效率,确保乘客安全…

项目文档管理利器:2024年你必须了解的工具

国内外主流的10款项目文档管理软件对比:PingCode、Worktile、Teambition、Tapd、Tower、Confluence、Notion、Dropbox Paper、Quip、Basecamp。在面对项目管理的复杂性时,选择合适的文档管理工具可以显著提高效率和团队协作。许多团队在文档管理上遭遇混乱和效率低下,尤其是…

做题小结 dp训练4

第一个 我按dp找 结果是个二分 我还想半天 这怎么dp 不过 这题目 也很有意义 首先我一直以为vector的low或者upp下标只能用distance求 现在看来是错的 不要再写auto 迭代器写法 用int就行 减初始指针就行 然后二分的话 思路也很好 先存进去 然后在跑t的时候 先开一个指针 然后对…

Modbus_RTU

本文主要记录串口通信,主要记录 modbus 的默认通信协议 modbus_RTU,当然modbus还包含 modbus_TCP(网口)和 modbus_ASCII(串口)。 一、基础知识 串口和网口串口:串口是一种物理接口,通常用于连接计算机和外部设备,如打印机、鼠标等。它使用一根线缆进行数据传输,常见的…