前言

📌博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍

毕业设计选题越来越重要,也越来越让同学感到焦虑。(切记先收藏起来)

很多同学不知道该如何确定题目,也不清楚导师真正关注的是什么,导致选题阶段浪费了很多时间。(选题指导)

其实,选题阶段最重要的不是一开始就想一个 “完美题目”,而是先把自己能做什么、感兴趣什么、导师可能认可什么理清楚。很多同学之所以选题困难,往往是因为没有把研究方向、题目来源、实践条件和论文写作要求结合起来考虑。(选题避坑)

如果选题没有做好,后面的开题、调研、实验、写作都会受到影响。因此,建议大家在正式确定题目之前,先多查资料、多和导师沟通,尽量选择一个既有研究价值、又有数据和案例支撑的题目。(有疑问可随时咨询,免费解答)

也可以参考一些优秀的毕业设计题目,帮助自己打开思路,避免走弯路(收藏,收藏,收藏~)

文章最下面,获取源码和数据库

Python选题参考

  • 基于Python的电商平台商品销售数据分析与趋势预测
  • 基于Python的个人账单管理系统
  • Python实现的露营装车租赁管理系统
  • 基于Python的悄悄读图书商城
  • 基于Python的高校综合交流社区系统
  • 基于Python的流动摊位信息系统
  • Python实现的企业办公用品智能管理
  • Python实现糖尿病防治科普系统
  • 基于Python的招聘信息数据分析系统
  • 基于Python的社区扶贫救助管理系统
  • Python实现的企业项目审批管理系统
  • 基于Python的景区停车管理系统
  • Python实现的汽车租赁系统
  • Python实现的在线图书借阅管理系统
  • Python实现的动力方健身房系统
  • 基于Python的开发板的环境监测仪器
  • Python实现的固定资产盘点管理系统
  • 基于Python的商超管理系統
  • 基于Python的鲜花销售系统
  • 基于Python的教室预约
  • 基于Python的藏品展示与交易系统
  • 基于Python的面向数字乡村的就业信息融合服务平台
  • 基于Python的社会志愿者服务管理系统
  • 基于Python的医院药品库存管理平台
  • 基于Python的校内外卖APP
  • 基于Python的零食仓储管理系统
  • Python实现的物流管理系统
  • Python实现的校园快递管理系统
  • Python实现的城市社区垃圾分类积分兑换管理系统
  • Python实现的重庆地区招聘数据分析与岗位推荐系统
  • Python实现的电脑硬件配置系统
  • Python实现的智慧“银发”经济养老平台
  • Python实现的“襄约·枕汾”旅居小院管理系统
  • 基于Python的动漫周边销售系统
  • 基于Python的客户投诉管理系统
  • 基于Python的医院挂号管理系统
  • 基于Python的安养院信息管理系统
  • 基于Python的影院智能管理系统
  • 基于Python的机械产品库存管理信息系统
  • 基于Python的废旧物资回收平台
  • 基于Python的高校寝室管理系统
  • Python实现的丝绸之路特色文化旅游信息服务平台
  • Python实现的小区老年居民服务系统
  • 基于Python的学校图书馆管理AI数字助手
  • Python实现的智能图书推荐系统
  • 基于Python的马拉松赛事管理系统
  • 基于Python的智慧药店药品管理系统
  • 基于Python的智能个人博客系统
  • 基于Python的校园二手交易系统
  • Python实现的上门安装维修服务系统
  • Python实现的非物质文化遗产商城管理系统
  • Python实现的沈阳云洗浴管理系统
  • Python实现的智慧文旅系统
  • Python实现的电商评论大数据情感分析与产品改进建议系统
  • Python实现的高校教工卡信息管理系统
  • Python实现的大学生就业平台
  • Python实现的五金仓库管理系统
  • Python实现的汽车租赁管理系统
  • Python实现的校园新闻发布系统
  • Python实现的宠物医疗店管理系统
  • Python实现的动物救助及领养管理系统
  • Python实现的课堂签到与互动系统
  • Python实现的生鲜销售数据分析与可视化系统
  • Python实现的考研刷题数据分析平台
  • Python实现的校运会管理系统
  • Python实现的山东省气象监测数据分析系统
  • Python实现的手工艺品销售管理系统
  • Python实现的邻里互助平台
  • Python实现的非遗文化数字化管理与在线传播系统
  • 基于Python的保龄球馆预约管理系统
  • 基于Python的中医问诊系统
  • 基于Python的零工平台管理系统
  • 基于Python的宠物用品商店APP
  • 基于Python的红旗影院电影售票系统
  • 基于Python的在线购物商城系统
  • Python实现的音乐服务平台
  • Python实现的心理健康互助小组管理平台
  • Python实现的课堂签到系统
  • Python实现的教育培训机构学员管理信息系统
  • Python实现的校园健康膳食管理平台 
  • Python实现的搜索引擎系统
  • Python实现的甘肃省博物馆信息管理系统
  • Python实现的社区邻里互助共享系统
  • Python实现的中医体质辨识与个性化养生方案
  • Python实现的罕见病交流平台
  • 基于Python的服装商城管理系统
  • 基于Python的自习室智能预约系统
  • 基于Python的演唱会门票管理系统
  • 基于Python的二次元产品交流与售卖系统
  • 基于Python的婚礼花艺线上销售系统

数据库参考

CREATE TABLE `slides` (
  `slides_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '轮播图ID',
  `title` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标题',
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '内容',
  `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '链接',
  `img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '轮播图',
  `hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击量',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`slides_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='轮播图';
DROP TABLE IF EXISTS `auth`;
CREATE TABLE `auth` (
  `auth_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '授权ID',
  `user_group` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户组',
  `mod_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '模块名',
  `table_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '表名',
  `page_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '页面标题',
  `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '路由路径',
  `parent` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '父级菜单',
  `parent_sort` int(10) NOT NULL DEFAULT '0' COMMENT '父级菜单排序',
  `position` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '位置',
  `mode` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '_blank' COMMENT '跳转方式',
  `add` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否可增加',
  `del` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否可删除',
  `set` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否可修改',
  `get` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否可查看',
  `field_add` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '添加字段',
  `field_set` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '修改字段',
  `field_get` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '查询字段',
  `table_nav_name` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '跨表导航名称',
  `table_nav` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '跨表导航',
  `option` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '配置',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`auth_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户权限管理';
DROP TABLE IF EXISTS `upload`;
CREATE TABLE `upload` (
  `upload_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '上传ID',
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名',
  `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '访问路径',
  `file` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件路径',
  `display` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '显示顺序',
  `father_id` int(11) DEFAULT '0' COMMENT '父级ID',
  `dir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件夹',
  `type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件类型',
  PRIMARY KEY (`upload_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件上传';
insert into `upload` values ('1','movie.mp4','/upload/movie.mp4','',null,'0',null,'video');
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject` (
  `subject_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '科目ID',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '科目名称',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`subject_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='科目';
insert into `subject` values ('1','科目1','2026-04-12 10:37:26','2026-04-12 10:37:26');
DROP TABLE IF EXISTS `message_inform`;
CREATE TABLE `message_inform` (
  `message_inform_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '通知ID',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '通知人ID',
  `title` varchar(255) DEFAULT NULL COMMENT '标题',
  `state` varchar(255) DEFAULT NULL COMMENT '状态',
  `type` varchar(64) DEFAULT NULL COMMENT '分类',
  `content` varchar(255) DEFAULT NULL COMMENT '内容',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`message_inform_id`) USING BTREE,
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='通知记录';
DROP TABLE IF EXISTS `user_group`;
CREATE TABLE `user_group` (
  `group_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户组ID',
  `display` smallint(4) unsigned NOT NULL DEFAULT '100' COMMENT '显示顺序',
  `name` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '名称',
  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '描述',
  `source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表',
  `source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段',
  `source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID',
  `register` smallint(1) unsigned DEFAULT '0' COMMENT '注册位置',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`group_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户组';
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
  `article_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章id',
  `title` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
  `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '文章分类',
  `hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击数',
  `praise_len` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源',
  `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源地址',
  `tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签',
  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '正文',
  `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '封面图',
  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '文章描述',
  PRIMARY KEY (`article_id`,`title`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章';
DROP TABLE IF EXISTS `access_token`;
CREATE TABLE `access_token` (
  `token_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '临时访问牌ID',
  `token` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '临时访问牌',
  `info` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '信息',
  `maxage` int(2) NOT NULL DEFAULT '2' COMMENT '最大寿命:默认2小时',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户编号',
  PRIMARY KEY (`token_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='登陆访问时长';
DROP TABLE IF EXISTS `exam`;
CREATE TABLE `exam` (
  `exam_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '考试id',
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '考试名称:[2,32]',
  `duration` int(11) DEFAULT NULL COMMENT '答题时长',
  `score` double(8,2) DEFAULT '0.00' COMMENT '总分',
  `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '状态:启用、禁用',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `open_start` datetime DEFAULT NULL COMMENT '开放开始时间',
  `open_end` datetime DEFAULT NULL COMMENT '开放结束时间',
  `reuse_state` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '启用' COMMENT '多次答题:启用、禁用',
  PRIMARY KEY (`exam_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='考试';
E TABLE `user_answer` (
  `user_answer_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户答题ID',
  `user_id` mediumint(8) NOT NULL COMMENT '用户ID',
  `exam_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '考试id',
  `score` double(8,2) DEFAULT '0.00' COMMENT '分数',
  `answers` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '答案',
  `score_detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '评分详情',
  `objective_score` double(8,2) DEFAULT '0.00' COMMENT '客观题得分',
  `subjective_score` double(8,2) DEFAULT '0.00' COMMENT '主观题得分',
  `score_state` tinyint(2) DEFAULT '0' COMMENT '评分状态',
  `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '提交人',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `comment_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '评语',
  PRIMARY KEY (`user_answer_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户答题';
DROP TABLE IF EXISTS `code_token`;
CREATE TABLE `code_token` (
  `code_token_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '验证码ID',
  `token` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '令牌',
  `code` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL COMMENT '验证码',
  `expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '失效时间',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`code_token_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='验证码';
DROP TABLE IF EXISTS `collect`;
CREATE TABLE `collect` (
  `collect_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '收藏人ID',
  `source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表',
  `source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段',
  `source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID',
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标题',
  `img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '封面',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`collect_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='收藏';
DROP TABLE IF EXISTS `exam_question_database`;
CREATE TABLE `exam_question_database` (
  `exam_question_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `subject_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '科目名称',
  `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类型',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '题目',
  `question_item` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '选项',
  `answer` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '参考答案',
  `score` double(8,2) DEFAULT NULL COMMENT '总分',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `answer_analysis` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '答案解析',
  PRIMARY KEY (`exam_question_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='试题库';

代码参考

from app.core import controller
import numpy as np
from app.service import service_select

controllerClass = getattr(controller, "Controller")

# 课程信息
class Course_information(controllerClass):
    def __init__(self, config={}):
        """
        构造函数
        @param {Object} config 配置参数
        """
        config_init = {
            # 选择的模板那路径模板
            "tpl": "./course_information/",
            # 注册API
            "get_api": [],
            # 注册post api路由
            "post_api": [],
            # 选择的服务
            "service": "course_information",
        }
        config_temp = config
        config_temp.update(config_init)
        super(Course_information , self).__init__(config_temp)

    # 协同过滤算法
    def Get_hits_list(self, ctx):
        query = dict(ctx.query)
        service = self.service
        if "user_id" in query:
            user_id = query.pop("user_id")
            if user_id == '':
                return self.Get_list(ctx)
            else:
                examine_state = ''
                if "examine_state" in query:
                    examine_state = query.pop("examine_state")
                # 查询该用户常点击
                hitsSource = "SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table = 'course_information' AND user_id = " + user_id + " GROUP BY source_id"
                hitsSourceList = service.run(hitsSource)
                # 判断是否为空,代表当前用户暂无点击数据,那么取其他用户的最常点击
                if len(hitsSourceList) <= 0:
                    hitsSource = "SELECT COUNT( hits_id ) AS hits_count, source_id FROM hits WHERE source_table = 'course_information' GROUP BY source_id"
                    hitsSourceList = service.run(hitsSource)
                table_name = "course_information"
                table_id = "course_information_id"
                type_name = "course_categories"
                # 二次处理-如果依旧为空则取添加时间前12条数据
                if len(hitsSourceList) <= 0:
                    sql = "SELECT * FROM " + table_name
                    if examine_state != '':
                        sql = sql + " where examine_state = '"+examine_state+"'"
                    sql = sql + " ORDER BY create_time DESC LIMIT 0,12"
                    list = service.run(sql)
                    return {"result": {"list": list, "count": len(list)}}
                else:
                    # 对用户点击量进行排序取得最大值
                    max = 0
                    maxSourceId = 0
                    for o in hitsSourceList:
                        hitsCount = float(o["hits_count"])
                        if hitsCount > max:
                            max = hitsCount
                            maxSourceId = o["source_id"]
                    # 查询该用户点击最大值的种类
                    typeSql = "SELECT " + type_name + " FROM " + table_name + " WHERE " + table_id + " = " + str(maxSourceId)
                    typeList = service.run(typeSql)
                    # 如果为空则取添加时间前12条数据
                    if len(typeList) <= 0:
                        sql = "SELECT * FROM " + table_name
                        if examine_state != '':
                            sql = sql + " where examine_state = '"+examine_state+"'"
                        sql = sql + " ORDER BY create_time DESC LIMIT 0,12"
                        list = service.run(sql)
                        return {"result": {"list": list, "count": len(list)}}
                    else:
                        # 查询该种类的数据
                        typeName = typeList[0][type_name]
                        sql = "SELECT * FROM " + table_name + " WHERE " + type_name + " = '"+typeName+"'"
                        if examine_state != '':
                            sql = sql + " and examine_state = '"+examine_state+"' ORDER BY create_time DESC limit 0,12"
                        else:
                            sql = sql + " ORDER BY create_time DESC limit 0,12"
                        resultList = service.run(sql)
                        # 如果为空则取添加时间前12条数据
                        if len(resultList) <= 0:
                            sql = "SELECT * FROM " + table_name
                            if examine_state != '':
                                sql = sql + " where examine_state = '"+examine_state+"'"
                            sql = sql + " ORDER BY create_time DESC LIMIT 0,12"
                            list = service.run(sql)
                            return {"result": {"list": list, "count": len(list)}}
                        else:
                            # 对结果排序-冒泡排序
                            n = len(resultList)
                            for i in range(n):
                                # 是否发生交换
                                swapped = False
                                for j in range(n-i-1):
                                    if resultList[j]["hits"] < resultList[j+1]["hits"]:
                                        resultList[j], resultList[j+1] = resultList[j+1], resultList[j]
                                        swapped = True
                                if not swapped:
                                    # 没有发生交换,则说明数组已有序,停止冒泡
                                    break
                            if len(resultList) < 12:
                                # 判断是否有12条-如果不足则计算其他类型和用户当前点击最多的余弦相似度,依次往下取得数据
                                typeCosSql = "SELECT " + type_name + " FROM " + table_name + " WHERE " + type_name + " <> '" + typeName + "' GROUP BY " + type_name
                                typeCosList = service.run(typeCosSql)
                                if len(typeCosList) > 0:
                                    for o in typeCosList:
                                        o["cosSim"] = self.similar(typeName, o[type_name], 2)
                                    # 冒泡根据相似度排序
                                    cosn = len(typeCosList)
                                    for i in range(cosn):
                                        # 是否发生交换
                                        swapped = False
                                        for j in range(n - i - 1):
                                            if j < cosn - 1:
                                                if typeCosList[j]["cosSim"] < typeCosList[j + 1]["cosSim"]:
                                                    typeCosList[j], typeCosList[j + 1] = typeCosList[j + 1], typeCosList[j]
                                                    swapped = True
                                        if not swapped:
                                            # 没有发生交换,则说明数组已有序,停止冒泡
                                            break
                                    # 逐条加入数据
                                    for o in typeCosList:
                                        sql = "SELECT * FROM " + table_name + " WHERE " + type_name + " = '" + o[type_name] + "'"
                                        if examine_state != '':
                                            sql = sql + " and examine_state = '"+examine_state+"'"
                                        sql = sql + " ORDER BY create_time DESC LIMIT 0," + str(12 - len(resultList))
                                        list = service.run(sql)
                                        if len(list) > 0:
                                            resultList.extend(list)
                            return {"result": {"list": resultList, "count": len(resultList)}}
        return self.Get_list(ctx)

    # 计算余弦相似度
    def similar(self, s, t, f):
        print(s)
        print(t)
        if not s or not t:
            return 0
        if s == t:
            return 100
        if len(s) > len(t):
            l = len(s)
        else:
            l = len(t)
        n = len(s)
        m = len(t)
        d = np.zeros((n+1, m+1))
        if not f:
            f = 2

        def min(a, b, c):
            if a < b:
                if a < c:
                    return a
                else:
                    return c
            else:
                if b < c:
                    return b
                else:
                    return c

        if n == 0:
            return m
        if m == 0:
            return n
        for i in range(0, n+1, 1):
            d[i][0] = i
        for j in range(0, m+1, 1):
            d[0][j] = j
        for i in range(1, n+1, 1):
            si = s[i - 1: i]
            for j in range(1, m+1, 1):
                tj = t[j - 1: j]
                if si == tj:
                    cost = 0
                else:
                    cost = 1
                d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost)
        res = (1 - d[n][m] / l) * 100
        return "{:.2f}".format(res)
# 课程笔记
class Course_notes(controllerClass):
    def __init__(self, config={}):
        """
        构造函数
        @param {Object} config 配置参数
        """
        config_init = {
            # 选择的模板那路径模板
            "tpl": "./course_notes/",
            # 注册API
            "get_api": [],
            # 注册post api路由
            "post_api": [],
            # 选择的服务
            "service": "course_notes",
        }
        config_temp = config
        config_temp.update(config_init)
        super(Course_notes , self).__init__(config_temp)
# 下载
class Download(controllerClass):
    def __init__(self, config={}):
        """
        构造函数
        @param {Object} config 配置参数
        """
        config_init = {
            # 选择的模板那路径模板
            "tpl": "./download/",
            # 选择的服务
            "service": "upload",
        }
        config_temp = {}
        config_temp.update(config)
        config_temp.update(config_init)
        super(Download, self).__init__(config_temp)

    # 下载文件
    def Index(self, ctx):
        src = ctx.query["src"]
        name = src.split("/")[-1]
        filename = open("static" + src, "rb")
        response = FileResponse(filename)
        response["Content-Type"] = "application/octet-stream"
        response["Content-Disposition"] = "attachment; filename*=utf-8''{}".format(escape_uri_path(name))
        return response

源码获取

下方名片联系我即可~
大家点赞、收藏、关注、评论啦

Logo

一站式 AI 云服务平台

更多推荐