
前言✨博主介绍一线全栈工程师毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码帮你把毕设做成作品集。精彩专栏 推荐订阅海量实战库源码任你选 坐拥Java项目2000套海量实战库源码任你选 坐拥Python项目1000套海量实战库源码任你选 坐拥小程序/app项目500套✅获取源码请私信✅感兴趣的可以先收藏起来还有大家在毕设选题项目以及论文编写等相关问题都可以找我咨询希望帮助更多的人❤️系统实现用户角色功能实现天气查询天气查询功能主要是对第三方天气数据进行检索展示。用户在查询区域输入城市关键词后提交请求系统根据关键词返回对应城市的实况天气及七天天气预报。用户切换城市时页面会重新加载该城市天气结果。若存在预警信息用户可以进入详情查看对应内容也可以查看雷达云图获取图形化天气状态。天气查询界面天气信息天气信息功能主要是对爬虫采集的天气记录进行检索展示。用户进入页面后可以按照城市、记录日期等条件发起筛选也可以按温度或日期进行排序。系统根据条件刷新列表结果用户重置条件后页面恢复默认数据。用户选择某一条天气记录时系统进入对应详情页面。天气信息界面通知公告通知公告功能主要是对系统发布的公告内容进行查看。用户进入公告页面后系统按照时间顺序展示公告列表。用户选择公告标题后页面进入公告详情显示对应公告正文。用户返回列表后可以继续查看其他公告记录。该功能仅面向公告浏览不涉及用户端维护操作。通知公告界面天气信息详情天气信息详情功能主要是对单条天气记录进行详细展示。用户从天气信息列表或推荐列表进入详情页后系统展示该天气记录对应的城市、日期、星期、温度、风力风向、空气质量等内容。用户执行点赞操作后系统接收操作结果并刷新点赞状态。天气信息详情界面天气信息推荐天气信息推荐功能主要是对系统推荐的天气记录进行展示。用户进入推荐页面后系统按照推荐标识加载天气信息列表。用户选择推荐条目后页面跳转到对应天气详情。若推荐列表为空页面展示空结果状态若存在推荐数据系统按照列表形式呈现用户可以继续查看详情。天气信息推荐界面天气统计图天气统计图功能主要是对天气信息数据进行图形化展示。用户进入统计图页面后系统加载爬取量占比饼状图及风力风向漏斗图。用户切换图表类型时页面根据选择刷新展示形式。用户缩放图表或查看数据标签后系统显示对应数据值辅助用户理解天气记录分布。天气统计图界面管理员角色功能实现天气信息管理天气信息管理功能主要是对系统中的天气记录进行维护。管理员进入管理页面后可以按照城市或记录日期查询天气信息也可以重置查询条件恢复列表。管理员选择记录后可查看详情、查看用户评论、删除指定记录。新增天气信息时系统接收表单内容并保存管理员也可跳转至预测页面。天气信息管理界面天气信息预测天气信息预测功能主要是对指定城市的天气描述进行预测处理。管理员选择预测城市后系统接收城市信息。若管理员输入天气描述则系统依据输入内容生成预测结果若未输入描述则页面可自动生成基础描述。管理员执行添加预测记录后系统保存预测结果关闭窗口后返回管理页面。天气信息预测界面数据大屏数据大屏功能主要是对天气信息统计结果进行集中展示。管理员进入数据大屏后系统加载城市占比饼图、天气信息数据表、星期占比图、风力风向漏斗图等内容。管理员刷新大屏时系统重新读取天气数据并更新图表。该页面以图表及列表组合方式呈现后台数据情况。数据大屏界面通知公告管理通知公告管理功能主要是对系统公告内容进行维护。管理员可以按照标题或时间查询公告也可以新增公告、编辑公告、删除公告、查看公告详情。系统根据管理员操作刷新公告列表新增或编辑完成后保存公告内容。删除操作完成后页面返回最新列表状态。通知公告管理界面资讯管理资讯管理功能主要是对系统资讯内容进行维护。管理员可以按照标题、标签、分类搜索资讯也可以新增资讯、编辑资讯、删除资讯、查看资讯详情。管理员进入评论查看页面后系统展示该资讯关联评论。若存在分类管理子功能管理员可对资讯分类进行维护页面根据操作结果刷新数据。资讯管理界面数据库参考CREATE TABLE user ( user_id int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 用户ID, state smallint(1) unsigned NOT NULL DEFAULT 1 COMMENT 账户状态(1可用|2异常|3已冻结|4已注销), user_group varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 所在用户组, login_time timestamp NULL DEFAULT NULL COMMENT 上次登录时间, phone varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 手机号码, phone_state smallint(1) unsigned NOT NULL DEFAULT 0 COMMENT 手机认证(0未认证|1审核中|2已认证), username varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT COMMENT 用户名, nickname varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT COMMENT 昵称, password varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT COMMENT 密码, email varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT COMMENT 邮箱, email_state smallint(1) unsigned NOT NULL DEFAULT 0 COMMENT 邮箱认证(0未认证|1审核中|2已认证), avatar varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 头像地址, open_id varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 针对获取用户信息字段, create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, vip_level varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 会员等级, vip_discount double(10,2) DEFAULT 0.00 COMMENT 会员折扣, integral int(11) DEFAULT 0 COMMENT 积分, balance double(10,2) DEFAULT 0.00 COMMENT 余额, ip varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT IPv4/IPv6地址, device_hash varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 设备指纹, emergency_name varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 紧急联系人, emergency_mobile varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 紧急联系电话, PRIMARY KEY (user_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT用户账户; CREATE TABLE weather_information(weather_information_id int(11) NOT NULL AUTO_INCREMENT COMMENT 天气信息ID, record_city varchar(64) comment 城市, record_date text comment 记录日期, record_week text comment 星期, highest_temperature text comment 最高温, minimum_temperature text comment 最低温, weather text comment 天气描述, wind_speed_and_direction text comment 风力风向, air_quality text comment 空气质量, cover_image varchar(255) comment 封面图, hits int(11) DEFAULT 0 NOT NULL comment 点击数, praise_len int(11) DEFAULT 0 NOT NULL comment 点赞数, collect_len int(11) DEFAULT 0 NOT NULL comment 收藏数, comment_len int(11) DEFAULT 0 NOT NULL comment 评论数, recommend int(11) DEFAULT 0 NOT NULL comment 智能推荐, unique_id varchar(64) DEFAULT NOT NULL COMMENT 唯一ID, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, create_by int(11) DEFAULT 1 NOT NULL comment 创建用户ID, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (weather_information_id))ENGINEInnoDB DEFAULT CHARSETutf8mb4 comment 天气信息; CREATE TABLE weather_information_forecast(weather_information_forecast_id int(11) NOT NULL AUTO_INCREMENT COMMENT 天气信息ID, record_city VARCHAR(64) COMMENT 预测字段1, weather VARCHAR(64) COMMENT 预测结果, output text COMMENT 预测图表, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (weather_information_forecast_id))ENGINEInnoDB DEFAULT CHARSETutf8mb4 comment 天气信息预测;代码参考# 论坛类型 class Article_type(controllerClass): def __init__(self, config{}): 构造函数 param {Object} config 配置参数 config_init { # 选择的模板那路径模板 tpl: ./article_type/, # 选择的服务 services: article_type } config_temp config config_temp.update(config_init) super(Article_type, self).__init__(config_temp) # 下载 class Download(controllerClass): def __init__(self, config{}): 构造函数 param {Object} config 配置参数 config_init { # 选择的模板那路径模板 tpl: ./download/, # 选择的服务 services: 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 make_response(filename) response.headers[Content-Type] application/octet-stream response.headers[Content-Disposition] attachment; filename*utf-8{}.format(src.encode().decode(latin-1)) return response # 普通用户 class Regular_user(controllerClass): def __init__(self, config{}): 构造函数 param {Object} config 配置参数 config_init { # 选择的模板那路径模板 tpl: ./regular_user/, # 注册API get_api: [], # 注册post api路由 post_api: [], # 选择的服务 services: regular_user, } config_temp config config_temp.update(config_init) super(Regular_user , self).__init__(config_temp) # 添加数据成功后 def Add_before(self, ctx): 添加数据前 param {Object} ctx http请求上下文 return {Object} 返回json-rpc格式结果 body ctx.body service self.service return {code: 0} # 天气信息 class Weather_information(controllerClass): def __init__(self, config{}): 构造函数 param {Object} config 配置参数 config_init { # 选择的模板那路径模板 tpl: ./weather_information/, # 注册API get_api: [get_algorithm_forecast,get_forecast_list,], # 注册post api路由 post_api: [add_forecast,], # 选择的服务 services: weather_information, } config_temp config config_temp.update(config_init) super(Weather_information , self).__init__(config_temp) # 添加数据成功后 def Add_before(self, ctx): 添加数据前 param {Object} ctx http请求上下文 return {Object} 返回json-rpc格式结果 body ctx.body service self.service return {code: 0} # 协同过滤算法 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( collect_id ) AS hits_count, source_id FROM collect WHERE source_table weather_information AND user_id user_id GROUP BY source_id ORDER BY create_time desc hitsSourceList service.run(hitsSource) # 判断是否为空,代表当前用户暂无点击数据那么取其他用户的最常点击 if len(hitsSourceList) 0: hitsSource SELECT COUNT( collect_id ) AS hits_count, source_id FROM collect WHERE source_table weather_information GROUP BY source_id ORDER BY create_time desc hitsSourceList service.run(hitsSource) table_name weather_information table_id weather_information_id type_name record_city # 二次处理-如果依旧为空则取添加时间前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((n1, m1)) 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, n1, 1): d[i][0] i for j in range(0, m1, 1): d[0][j] j for i in range(1, n1, 1): si s[i - 1: i] for j in range(1, m1, 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) def Get_algorithm_forecast(self, ctx): query dict(ctx.query) if forecast_column in query: source_table query.get(source_table, ).strip() input_column query.get(input_column, ).strip() input_value query.get(input_value, ).strip() forecast_column query.get(forecast_column, ).strip() if source_table or input_column or input_value or forecast_column : return {error: 参数不能为空} else: try: if isinstance(input_column, str): input_column [col.strip() for col in input_column.split(,)] if isinstance(input_value, str): input_value [val.strip() for val in input_value.split(,)] # 决策树算法 forecastdecision_tree_forecast.Get_forecast(source_table,input_column,input_value,forecast_column) return_json{result: {forecast: forecast}} return return_json except Exception as e: print(f算法执行错误: {str(e)}) return {error: f算法执行失败: {str(e)}} else: print(参数错误) def Get_forecast_list(self, ctx): query dict(ctx.query) config { table: weather_information_forecast} for key in [page, size, like,orderby]: if key in query: config[key] query.pop(key) final_config {**self.config, **config} count self.service.Count(query, final_config) lst [] if self.service.error: return {error: self.service.error} elif count: lst self.service.Get_list(query, final_config) if self.service.error: return {error: self.service.error} self.interact_list(ctx, lst) return {result: {list: lst, count: count}} def Add_forecast(self, ctx): try: body ctx.body if isinstance(body, bytes): data json.loads(body.decode(utf-8)) elif isinstance(body, dict): data body elif isinstance(body, str): data json.loads(body) else: return {error: f不支持的请求体类型: {type(body)}} config {table: weather_information_forecast} result self.service.Add(data, config) if hasattr(self.service, error) and self.service.error: print(错误信息:, self.service.error) return {error: self.service.error} return {result: 保存成功, insert_id: result} except json.JSONDecodeError as e: print(JSON解析错误:, str(e)) return {error: fJSON解析失败: {str(e)}} except Exception as e: print(错误:, str(e)) return {error: f保存失败: {str(e)}}前端基于Vue.js框架构建用户界面使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑通过Vue Router管理路由Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面Axios封装HTTP请求实现与后端的数据通信。后端基于flask框架搭建遵循MTVModel-Template-View模式同时结合DRFDjango REST Framework实现RESTful API。Model层定义数据模型并与数据库交互View层通过DRF的视图集ViewSet或通用视图GenericView处理请求并结合序列化器Serializer完成数据的序列化与反序列化Service层可选封装复杂业务逻辑保持视图层简洁。使用Django内置的认证系统或djangorestframework-simplejwt结合JWT实现用户认证与权限控制。数据库采用MySQL存储持久化数据Redis缓存热点信息以提升系统性能。开发工具使用PyCharm开发后端VSCode或HBuilderX开发前端Git进行版本管理pipenv或poetry管理后端依赖npm管理前端依赖。源码获取私信联系我即可~大家点赞、收藏、关注、评论啦精彩专栏 推荐订阅海量实战库源码任你选 坐拥Java项目2000套海量实战库源码任你选 坐拥Python项目1000套海量实战库源码任你选 坐拥小程序/app项目500套✅获取源码请私信✅感兴趣的可以先收藏起来还有大家在毕设选题项目以及论文编写等相关问题都可以找我咨询希望帮助更多的人❤️