谈论一些代码实现的逻辑(四)

2024-03-25 23:12
文章标签 代码 实现 逻辑 谈论

本文主要是介绍谈论一些代码实现的逻辑(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

谈论一些代码实现的逻辑(四)

文章目录

  • 前言
  • 1. 登录功能
  • 2. 悬浮框功能
  • 3. markdown编辑器和富文本编辑器的共同集成
  • 4. 工具库的类别的分类
  • 5. 在flask中引入echarts图表
  • 6. 聊天室的实现
  • 总结


前言

上一篇博客介绍了项目的目录结构,已经有了一点对项目的认识,接下来我将具体简述一些主要功能的代码实现的逻辑(原本我是想具体讲述的,然后发现太多了,于是就挑选几个来将一下实现的逻辑吧)

其余更多代码实现还是直接看源码吧


1. 登录功能

主要分为登录、注册、找回密码

有两个登录的地方,一个是介绍页面、一个是星云笔记页面

前者的前端是用bootstrap的选项卡功能实现的,后者则是加上了模态框。

至于其对应的js代码,我也是放在 /resource/js/login.js 文件中

实现了发送邮件、登录、注册、退出登录的事件

另外,我还添加了接受经度和维度,获取用户的地理位置的代码,及用户每次登录、以及用户注册时会获取(但是,这个功能要支持https服务才能开启,不然会被拦截,不能实现)

2. 悬浮框功能

这是一个小的功能,方便用户的快速跳转到主要功能页面

其主要是依靠css样式和js的鼠标监听事件来完成的

<link rel="stylesheet" href="/css/悬浮框.css"/>
<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script><div class="Box_xuanfu"><div class="box_xuanfu"><ion-icon name="apps-sharp"></ion-icon></div><div><a href="/notebook" class="panel" ><ion-icon name="brush"></ion-icon><span class="tooltiptext">笔记</span></a><a href="/person/{{session.get('userid')}}" class="panel" ><ion-icon name="person"></ion-icon></a><a href="/chatroom/index" class="panel" ><ion-icon name="chatbox-ellipses"></ion-icon></a><a href="/home/{{session.get('userid')}}" class="panel" ><ion-icon name="home"></ion-icon></a><a href="/tools" class="panel" ><ion-icon name="construct"></ion-icon></a><a href="#" class="panel" ><ion-icon name="settings"></ion-icon></a></div></div><script src="/js/悬浮框.js"></script>

3. markdown编辑器和富文本编辑器的共同集成

星云笔记是支持使用markdown编辑器和富文本编辑器的共同使用。

而我是如何区分哪些文章是由markdown语法编写,哪些文章是html语法呢。

可以通过在article表中插入一列,来区别,比如我用1表示是markdown,用表示是文本,
然后我可以在提交文章的代码中添加这个判断参数,传给后端处理,

我定义了一个函数,用来区分它们


def is_markdown(articleid):article = Article()result = article.find_is_markdown_by_id(articleid)if result and result.is_markdown == 1:return "md_article"else:return "article"

将返回的值拼接到URL中,就能区别开来

markdown语法写的:
http://www.whtuu.cn/notebook/md_article/41富文本写的:
http://www.whtuu.cn/notebook/article/42

4. 工具库的类别的分类

在工具库的工具分类时,我是通过给每一个类别映射一个数字

# 1代表AI工具、11代表AI工具下的”常用"、12代表AI工具下的”AI图像工具"、13代表AI工具下的”AI聊天工具"、14代表AI工具下的”AI 视频工具"# 2代表生信软件,21、22、23、24# 3代表生信网站,31、32、33、34# 4代表消息获取# 5代表设计美化# 6代表学习网站# 7代表其它

然后在提交工具的时候,将每个类别对应的数字提交到数据库就行

同样我也定义了一个代码用来返回对应的分类名称

# 根据tools_type命名对应的分类信息
def ming_tools_by_type(type):primary_category = ""secondary_category = ""if type.startswith("1"):primary_category = "AI工具"if type == "11":secondary_category = "常用"elif type == "12":secondary_category = "AI图像工具"elif type == "13":secondary_category = "AI聊天工具"elif type == "14":secondary_category = "AI视频工具"elif type.startswith("2"):primary_category = "生信软件"if type == "21":secondary_category = "常用"elif type == "22":secondary_category = "基因相关"elif type == "23":secondary_category = "环境相关"elif type == "24":secondary_category = "其它"elif type.startswith("3"):primary_category = "生信网站"if type == "31":secondary_category = "常用"elif type == "32":secondary_category = "基因相关"elif type == "33":secondary_category = "环境相关"elif type == "34":secondary_category = "其它"elif type.startswith("4"):primary_category = "消息获取"if type == "41":secondary_category = "日常"elif type == "42":secondary_category = "生信相关"elif type == "43":secondary_category = "AI相关"elif type == "44":secondary_category = "古诗词文化"elif type == "5":primary_category = "设计美化"elif type == "6":primary_category = "学习网站"elif type == "7":primary_category = "其他"return primary_category, secondary_category

5. 在flask中引入echarts图表

主要是将从后端获取的数据填充到前端的图表中

大致分为两类:

一类是 返回 xxx.dump_options_with_quotes()


# 用户的文章条形图
@py_echarts.route("/py_echarts/bar-article-user", methods=["POST", "GET"])
def get_bar_chart_user():userid = request.form.get("userid")article = Article()favorite = Favorite()comment = Comment()favorite_count = favorite.query_my_favorite_count(userid)favorited_count = favorite.query_my_article_favorited_count(userid)article_count = article.get_count_user_except_drafted(userid)drafted_count = article.get_count_user_drafted(user_id=userid)comment_count = comment.query_comments_count_by_userid(userid)commented_count = comment.query_comments_count_by_articleid(userid)read_count = article.get_readcount_by_user(userid)recommend_count = article.query_recommend_count_by_user(userid)hide_count = article.query_hide_count_by_user(userid)# 设置条形图的标签和值bar = (Bar().add_xaxis(["收藏数", "被收藏数", "文章数", "草稿数", "评论数", "被评论数", "阅读数", "推荐数", "隐藏数"])  # x轴标签.add_yaxis("用户文章信息",[favorite_count, favorited_count, article_count, drafted_count, comment_count, commented_count,read_count, recommend_count, hide_count], itemstyle_opts=opts.ItemStyleOpts(color="#749f83"))  # y轴值,对应上面的标签)return bar.dump_options_with_quotes()

然后在前端页面的js代码中发送ajax请求给上面定义的接口

 //文章总结的条形图var chart_bar = echarts.init(document.getElementById('bar-article'), 'white', {renderer: 'canvas'});$(function () {fetchData_bar(chart_bar);});function fetchData_bar() {$.ajax({type: "POST",data: {userid: userid},url: "/py_echarts/bar-article-user",dataType: "json",success: function (result) {chart_bar.setOption(result);}});}

另一类则是,使用flask 的render_template() 函数将 生成的嵌入式代码 rendered_chart = c.render_embed(),传给前端;

# 管理后台的用户数据
@py_echarts.route("/person/admin/user")
def admin_user():user = Users()user_at = user.find_by_admin()user_count = user.get_count_all_user()user_locations = user.find_all_users_location()# 在这里执行生成地图的代码from pyecharts import options as opts# 创建 Geo 地图实例c = (Geo(InitOpts(width="1000px", height="1000px")).add_schema(maptype="china")  # 设置地图类型为中国地图)data = []# 遍历 user_locations,添加每个用户的地理位置到地图中for userid, time, lon, lat in user_locations:# 添加坐标点,这里假设每个用户的位置都有一个唯一的名称# 例如,可以使用时间戳或者用户ID作为名称name = useridc.add_coordinate(name, lon, lat)value = str(time)  # 或者其他您想展示的值# 将当前用户的位置和值添加到 data 列表中data.append((name, value))series_name = "用户来源"c.add(series_name, data, type_=ChartType.EFFECT_SCATTER)# 设置系列和全局选项c.set_series_opts(label_opts=opts.LabelOpts(is_show=False))  # 设置标签不显示c.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_show=False),  # 设置视觉映射配置项,比如颜色条title_opts=opts.TitleOpts(title="用户地理位置分布")  # 设置图表标题)# 生成嵌入代码rendered_chart = c.render_embed()return render_template('/shujumianbang/user_admin.html',user_at=user_at, user_count=user_count, chart=rendered_chart)

然后,在前端使用jinji2的语法 {{chart | safe}},将图表插入

<div class="row"><div class="col-md-12"><div class="card"><div class="card-body"><div class="row" style="text-align: center;"><div class="col-6"><div class="d-md-flex align-items-center " style="width:900px"><h2>用户的来源记录</h2></div><div style="width:1600px; height:900px;">{{chart |safe}}</div></div></div></div></div></div></div>

6. 聊天室的实现

要安装flask_socketio ,创建socketio实例

控制台代码:

@chatroom.route("/chatroom/chatroom", methods=['POST', 'GET'])
def chatroom_chatroom():if session.get('islogin') is None:return redirect(url_for('index'))else:user_id = session.get('userid')message = Message()message_result = message.get_messages()# users = Users().find_all_users_all()follow = Follow()user_guanzhu = follow.get_follow_users_with_details(userid=session.get('userid'))avatar = message.get_at_avatar(user_id=user_id)# nickname = session.get('nickname')return render_template("/chatroom/chatroom.html", message_result=message_result, user_guanzhu=user_guanzhu,avatar=avatar)# 连接聊天室
@socketio.on('connect', namespace='/chatroom/chatroom')
def connect():print('连接成功!!')# 加入房间
@socketio.on('joined', namespace='/chatroom/chatroom')
def joined(information):# 'joined'路由是传入一个room_name,给该websocket连接分配房间,返回一个'status'路由room_name = 'chat room'user_name = session.get('nickname')print(user_name)join_room(room_name)emit('status', {'server_to_client': user_name + ' enter the room'}, 'room=room_name')# 接收聊天信息
@socketio.on('text', namespace='/chatroom/chatroom')
def text(information):text = information.get('text')nick_name = session.get('nickname')  # 获取用户名称user_id = session.get('userid')  # 获取用户IDcommunicate_user = request.form.get('communicate_user')Message().insert_message(content=text, communicate_userid=communicate_user)  # 将聊天信息插入数据库,更新数据库create_time = time.strftime('%Y-%m-%d %H:%M:%S')avatar = Message().get_at_avatar(user_id=user_id)  # 获取用户头像# 返回聊天信息给前端emit('message', {'nickname': nick_name,'text': text,'create_time': create_time,'avatar': avatar,})

前后台对接的js代码:

$(document).ready(function () {//创建实例socket = io.connect('https://' + document.domain + ':' + location.port + '/chatroom/chatroom');log('xxqqq', socket)// alert()socket.on('connect', function () {log('连接成功');});socket.on('message', function (data) {Username = data.nicknametext = data.textcreate_time = data.create_timevar avatar_url = data.avatarlog(Username + ':' + text)var deleteButton = "";// if (userid === session.get("userid")) {deleteButton = "<button class='delete-chedi btn btn-outline-success' data-messageid='" + data.message_id + "'>❌</button>";// }if (filepath) {$(".chat-discussion").append("<div class='chat-message left'> <img class='message-avatar' src='/chat_room/images/" + avatar_url + "' alt='' > <div class='message'><a class='message-author' > " + Username + "</a> <span class='message-date'>" + create_time + " </span><span class='message-content'> <img src='" + filepath + "' class='imgchat' style='height: 100px;weight:100px'/>" + text + "</span> " + deleteButton +"</div> </div>");$(".img").attr("src", '');} else {$(".chat-discussion").append("<div class='chat-message left'> <img class='message-avatar' src='/chat_room/images/" + avatar_url + "' alt='' > <div class='message'><a class='message-author' > " + Username + "</a> <span class='message-date'>" + create_time + " </span><span class='message-content'>" + text + "</span>" + deleteButton + "  </div> </div>");}});$('.enter').keypress(function (e) {var code = e.keyCode || e.which;if (code == 13) {//获取聊天框聊天内容var Texttext = $('.enter').val();//清空聊天框$('.enter').val('');//向后端发送聊天内容socket.emit('text', {'text': Texttext});}});$('#Emoji').change(function () {//一:console.log($(this).val());//二:$("#Emoji").val();//获取当前选择项的值.var options = $("#Emoji option:selected");//获取当前选择项.options.val();//获取当前选择项的值.$('.enter').val($('.enter').val() + options.val());console.log(options.val());})});

总结

差不多就到这吧,其实,这个项目感觉并没有达到预期,只能说与我最开始想的样子不太一样,但是不管怎么说,也就先做到这一步了,虽然有些功能还有问题,需要完善。

寂寞空庭春欲晚,梨花满地不开门

–2024-3-22

这篇关于谈论一些代码实现的逻辑(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim