文章

CS50-如何打造一个超级实用的web应用!(flask+bootstrap)

在此之前感谢一下Professor David Malan和CS50

Professor David Malan是一个真正被称为可以称之为大师的人!

还有Brian,Carter, Doug等等

看完cs50的时候,才真正意识到,什么是真正的教学质量,什么是真正教授。David Malan在每次在台上演讲的时候,所有上过cs50人都能够感觉到,他是一个非常激情澎拜的人,可以感受到他对cs,对cs50对教学的热情。我觉得passion是一个人能不能做好一件事的关键。

后面才知道Brain在录制课程的时候,竟然还是本科生,并且他还参与了CS50ai的课程,不禁感优秀的黄种人也是很优秀的 记录一下我做的最后一个cs50作业,这个是我做的模拟股票交易的网页,购买了苹果,英伟达,特斯拉,赚了一点钱哈哈 cs50_finance作业截图

这个作业是最终的项目,结合了前面很多个章节的知识。

project主要的目的是打造一个可以模拟操作股票的web应用,能够学会使用cs50项目提供的api接口,

获取到实时的股票价格,可以进行买入卖出的操作。这个项目我认为对于新手来练手是一个非常的不错项目

带有了一些挑战性同时,可以让刚刚接触cs的人可以上手做一个非常实用的项目!

如果结合David Malan教授在lecture上的讲座,我认为这个项目虽然有挑战性,

但是把lecture以及section和shorts上的项目都仔细做一遍,并且在做的时候,多观察,多思考,我认为绝对是可以自己完成的。

说一下这个目需要用到的知识,python的语法,flask框架(后端),一些前端知识(项目里面是用的是bootstrap),sql(利用cs50提供的sql库可以操作sqlite3,对数据库进行操作)

股票购买的知识

  • 股票的购买,当你在一个股票10块钱的时候买了100股份(shares),你在股票升到20块钱的时候买了100股份。那么你就拥有了200股份,价格是15元的股份
  • 假设你在10块钱的时候购买了100股份,在20块钱的时候购买了300股份。那么你就拥有了400股份,但是股价怎么计算呢?

    计算方法:股票的总价值 / 拥有的股份数量,(10*100 + 20*300) / 400 = 17.5

    因此可以知道,在两次购入之后,你最终持有的这支股票,是价格为17.5$,股份数量是400shares

后端部分:在flask里面,各个不同的route的模块的介绍

  1. cookies以及sessions
    • 这部分内容是我认为最重要的里面(因为我现在还没搞懂,10-19-2023),只是调用了cs50老师给我们配置好的环境
    • 参考例子:关于如何在cookies里面存储用户的id,以及session,可以参考David在课堂上讲的一个”login”的例子。https://cdn.cs50.net/2022/fall/lectures/9/src9/login/>
    • cs50已经给我们实现好的是log in和log out,也就是登陆和登出的模块,这两个模块是通过flask操作用户的session和cookies。这样子可以记住用户的登录状态。
    • David在lecture上举过一个非常形象的例子,他把cookies比作是一个印章,session就好像去游乐园游玩。当你进入游乐园的时候,园区的管理人员就会在你的手背上盖下一个独一无二的印章(也就是把cookies留在你的手背上)。这样子,你虽然走出了园区,但是园区的管理人员(网站后端程序),每次都可以通过查看你的cookies和他保留的是否匹配,如果匹配的话,就认为你是已经买票的游客,而不是还没有买票的游客。这样子就可以方便游客,不用每次都重新登录了。当然可以在后端可以设置cookies的有效时长,而用户本身也可以通过清除cookies或者使用隐私模式(incognito)模式,来清除cookies。
    • 当我们需要需要获取用户的当前id的
  2. api函数
    • 这部分内容cs50已经帮我们调用好了,在helpers库里面,只需要传入正确的股票symbol号,能够返回一个json格式的字典。可以获得实时的股票价格
  3. apology函数
    • 这个函数很可爱,可以返回一只带有提示文字的哭哭猫🐱,可以提示用户出错,也是借用了一个api接口。cs50的老师已经帮我们配置好了,直接调用就可以了
  4. 前端部分
    • 使用的是bootstrap的开源框架,cs50也帮我们做好了,当然也可以自行修改
  5. register模块
    • 这个是真正意义上第一个动手做的模块,也就是注册(register)模块
    • 用户可以输入自己的用户名,两次验证密码
    • 验证通过,将密码使用hash加密后,将哈希值保存包数据库
  6. quote模块
    • 主要是用来查询股票的实时价格
    • 当用户输入错误的股票symbol的时候,需要返回apology报错403
  7. buy模块
    • 用户可以在这个模块买入股票
    • 当用户输入错误的股票symbol或者错误的shares,需要返回apology报错
    • 在每次购买之后,需要更新数据库里面的用户的stockown(股票持有的时候)以及transactions(股票交易记录)
  8. index模块
    • 当用户购买并且持有了一定的股票时候,需要呈现出用户所持有的股票以及交易记录
    • index可以呈现用户持有的所有股票,现金余额,股票总资产数量等
  9. sell模块
    • 用户可以出售自己的股票,获得现金
    • 当输入用户未持有的股票symbol或者shares时,返回apology
  10. history模块
    • 用户在此处可以看到所有的交易记录,包括买入卖出,成交数量和金额
  11. reset模块
    • 用户可以在这里可以重置密码
    • 输入存在的用户即可重置
  12. add模块
    • 用户可以增加自己的金额💰
    • 当然也可以减少

下面是一些比较稀碎的技术细节

这些技术细节以及实现方法,是我个人通过综合了google搜索和询问chatgpt和我自己的一些灵感写出来的。因为担心会遗忘,所以先记录在下面。如果认为有可以改进的地方,读者可以联系我提出更好的解决方案,我也会虚心学习。

1. 数据库的创建

  • 因cs50只是给我们提供了用户的数据库(users),用户的数据库里面可以存放的只有用户用户姓名,hash密码,为了能够存放用户的所持有的股票,以及历史交易记录,我们必须另外创建两个table,并且这些table都是必须要通过user的id进行互相关联的。这样子可以在index模块,history里面进行展示一个able。

2. 如何显示用户的持有股票,并且显示股票的实时金额

  • 我们知道,为了能够显示用户持有的股票,我们需要建立一个数据表。我们不仅需要显示用户当时购买的价格,还需要显示用户购买的股份,股票当前的价格。其中,出了股票当前的价格以外,其他数据都是存放在sql数据库里面的。那么怎么样才能够获得股票当前的价格,并且在index的里面展现出来呢?
  • 最开始的想法:我的解决方案是打算在jinjia的模板里面进行调用股票价格api获取。但是询问了gpt这种方法是否可行之后,gpt给我的回复是不可行的。因为jinjia只能够做一些简单的数学运算,我们最好把一些调用都放在后端python里面,这样子能够各施其职,保证jinjia模板的简洁性

  • 我的采用的解决方案:创建一个字典来获得实时的价格。通过遍历用户所持有的股票,通过api接口,将不重复的股票的实时价格数据保存到字典里面,通过jinjia语法获得这个事实调用api接口获得的字典实时价格,这样子我们就能够实现获得用户的实时价格啦!
  • 这个方法的缺点:需要用户手动刷新,才能够看到股票实时的数据
  • 以后改进缺点的方法:使用Ajax或者fetch等可以实时刷新的框架,这样就不需要用户每次手动刷新
本文由作者按照 CC BY 4.0 进行授权