快速入门:使用Python构建学生成绩管理应用

news2025/1/18 17:12:54

前言

诸位观众,本学期我有幸学习了Python编程课程。随着课程的结束,授课教师布置了一项任务,要求我们开发一个学生信息管理系统。基于老师的要求,我个人独立完成了这项任务。今天,我希望将这个简易的程序分享给大家,主要面向刚开始接触Python的新学者,希望它能助你们一臂之力。

在这个项目中,我将介绍如何从零开始构建这个学生信息管理系统,包括核心功能的实现以及设计思路。希望通过分享这个项目,能为Python初学者提供一个实践的案例,帮助你们更好地理解和掌握Python编程的基本技能。

让我们一起来学习如何用Python构建有效的学生信息管理系统,提升我们的编程能力吧。

总体构思 

在开发信息管理系统时,核心工作实际上是对数据的管理,这包括了数据的创建、删除、检索和修改,以及数据的读取、显示和存储等关键操作。这些操作确保了系统能够高效且准确地处理信息。

在数据结构的选择上,我遵循了教师推荐的数据结构方案。这意味着在构建系统时,我已确保采用的数据结构方案不仅可以满足当前的教学需求,同时也便于未来可能的扩展或调整。选择恰当的数据结构对于保证信息处理效率及系统性能至关重要。

此类系统的设计旨在优化数据的处理流程,确保各种操作如增加、删除、编辑及查询数据都能流畅执行。此外,良好的数据结构设计也有助于简化后续的数据处理任务,如数据分析和报告生成,从而提升整个系统的使用效率和用户的体验。

即如下:

score1 = { "姓名":"张三丰", 
         "学号":"U19990001", 
         "作业" : [80, 64, 67, 20], 
         "测验" : [75, 75], 
         "实验" : [78, 57] ,
         "分数" : 0
       } 

考虑到系统的灵活性与效率,我没有在数据结构中新增如排名等字段。主要原因在于,排名和平均分数可以通过已有的数据轻易计算得出,同时,这也避免了因单个成绩变动而需重新计算大量相关数据的繁琐过程。毕竟,随着存储数据量的增加,维护的复杂性也随之上升,尤其是对于相互依赖较强的数据项更是如此。

在数据存储方面,我选择了Python中广泛使用的列表作为程序的主要“数据库”结构,因其操作便捷且易于实现。关于排名问题,我确立了一个基本原则:列表中的每个数据项都根据成绩高低进行排序,确保整个列表始终保持有序状态。这样便有效地解决了排名问题,具体实现方式将在后文中详细介绍。

至于开发和运行环境,我使用的是Windows 10 x64位操作系统,配合Anaconda平台运行Python 3.7版本,并使用Spyder作为开发环境。这种配置无需额外安装任何库即可运行程序。

通过这些设计选择,我们旨在优化数据处理流程,提高系统的操作效率,同时简化数据维护工作,确保了系统能够高效、准确地服务于教学与信息管理的需求。

程序说明

在本节中,我将详细阐述该程序的主要功能及其对应的代码实现细节。在详细介绍这些功能前,我先说明一下我为此程序设定的一些基本规则:
1、成绩计算结果保留到小数点后三位。
2、排名的确定依据以下优先级顺序进行:考试成绩、作业平均分、测验平均分、实验平均分。在我们的设计中,不存在并列排名的情况。虽然极不可能,但如果确实有学生在这四项指标上完全一致,我们再另行考虑处理方案。
3、数据的文件保存与读取采用CSV格式,具体文件的头部结构如下:['序号', '姓名', '学号', '分数', '排名', '作业1', '作业2', '作业3', '作业4', '测验1', '测验2', '实验1', '实验2']。
这些规则旨在标准化数据的处理和存储方式,确保信息的准确性与系统的效率。接下来,我将逐一解释各功能的代码实现,以便读者能够更好地理解并应用于实际编程任务中。

主界面

程序的主要用户界面展示如下。虽然我个人的审美偏好较为传统,未能进一步美化界面,但功能实现是直观且实用的。

为了增强程序中提示信息的清晰度并提高用户体验,我设定了一套特定的颜色标准:

  • 蓝色用于标示需要用户响应的提示信息。
  • 红色用于显示系统操作的结果,例如操作的成功或失败。
  • 标准的黑色用于展示系统菜单以及查询的结果输出等。

这种颜色方案旨在帮助用户快速识别信息类型和系统反馈,从而提升交互效率。

添加学生信息

在学生信息录入功能中,除了支持手动输入数据之外,我还添加了从文件中导入数据的功能。为了确保数据的一致性和准确性,我实施了一项关键的约束措施:如果某个学生的学号已存在于系统中,则禁止重复添加该学生的信息。无论是手动输入还是文件导入,这一规则都被严格执行,以确保每个学生的学号在系统中保持唯一。这不仅减少了数据冗余,也避免了潜在的数据冲突问题。

在添加学生信息的过程中,考虑到之前提到的列表数据需要维持顺序的要求,我采用了插入排序算法来实现数据的添加。这种方法可以确保在添加新数据时,列表中的信息依然保持有序状态。以下是实现此功能的核心代码:

# 根据优先级[分数、作业平均、测验平均、实验平均]比较s1是否优于s2
def cmp_student(s1, s2):
    if s1["分数"] != s2["分数"]:
        return s1["分数"] > s2["分数"]
    else:
        if np.mean(s1["作业"]) != np.mean(s2["作业"]):
            return np.mean(s1["作业"]) > np.mean(s2["作业"])
        else:
            if np.mean(s1["测验"]) != np.mean(s2["测验"]):
                return np.mean(s1["测验"]) > np.mean(s2["测验"])
            else:
                return np.mean(s1["实验"]) > np.mean(s2["实验"])

# 根据分数大小,将学生信息插入到列表中,插入排序
def add_to_list(stu, stu_list):
    if len(stu_list):
        if cmp_student(stu, stu_list[0]): # 比第一名还优秀
            stu_list.insert(0,stu)
        elif not cmp_student(stu, stu_list[-1]): # 比最后一名还差
            stu_list.append(stu)
        else:
            for i in range(len(stu_list)-1):
                if (not cmp_student(stu, stu_list[i])) and (cmp_student(stu, stu_list[i+1])):
                    stu_list.insert(i+1, stu)
                    return
    else:
        stu_list.append(stu)

 手动添加时,逐个输入学生的信息,最后按照分数插入到相应的位置,注意的是,需要保证在输入成绩时确保获取的是 数字,否则提示错误需要用户重新输入:

# 输入一个数字
def input_number(information):
    while True:
        try:
            print("\033[34m",end='')
            number = input(information)
            print("\033[0m",end='')
            if type(eval(number)) == float or type(eval(number)) == int:
                return float(number)
        except :
            print('\033[1;31m',end='')
            print("输入有误,请输入一个数字!")
            print('\033[0m',end='')

 注:类似 print("\033[34m",end='')这类语句是控制输出的字体颜色的。下同

从文件中添加时,系统提供了默认文件的选项,直接回车则默认从 data_file 目录下的 学生成绩信息.csv 文件导入,因为有些用户是懒得输入文件名的。需要注意的是,导入的文件中,允许成绩选项缺失,如果缺失了,则利用其它成绩重新计算得出。但其它必要信息不能缺失: 

# 从文件添加学生信息
# 需要遵循格式:['序号','姓名','学号','分数','排名','作业1','作业2','作业3','作业4', '测验1', '测验2', '实验1', '实验2']
def add_from_file(stu_list):
    print("\033[34m",end='')
    fn = input("请输入文件路径(例如: C:/a.csv, 直接回车则默认为[./data_file/学生成绩信息.csv]) >> ")
    print("\033[0m",end='')
    file_path = './data_file/'+'学生成绩信息.csv' # 默认选项
    if fn != '':
        file_path = fn
    n = 0
    n_du = 0
    with open(file_path) as csvfile:
        csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件
        next(csv_reader)  # 跳过文件头
        for row in csv_reader:  # 读取数据
            if find_student_uid(row[2], stu_list) != -INF: # 如果存在学号相同,则不添加
                n_du = n_du + 1
                continue
            work       = [float(x) for x in row[5:9]] #转化作业成绩
            test       = [float(x) for x in row[9:11]] #转化测验成绩
            experiment = [float(x) for x in row[11:]] #转化实验成绩
            score = 0
            if row[3] == '':
                score = calc_score(work, test, experiment) # 考虑到成绩位置为空的情况,重新计算成绩。
            else:
                score = float(row[3])
            stu_info = {'姓名':row[1], '学号':row[2], '作业':work,
                    '测验':test, '实验': experiment, '分数':score}
            add_to_list(stu_info,stu_list)   #将字典数据添加到列表中,插入排序。
            n = n + 1
    print('\033[1;31m')  
    print("从文件["+file_path+"]添加信息成功!共添加 "+str(n)+" 条信息,跳过 "+str(n_du)+" 条重复信息!")
    print('\033[0m')  

    return stu_list

修改学生信息

这一块比较简单,找到学生信息后,输入相应信息然后修改。大部分都是提示输入的语句。

不过需要注意的是,修改了相应的作业、实验等成绩后,需要更新学生的分数,同时重新计算学生的排名,将该生挪到列表的相应位置上。具体做法在我的代码实现中比较简单,先将该生从列表中移除,重新计算分数后再按照插入排序的思路放进列表即可。这样速度可能会快一些。因为变动信息的只有一个学生,如果再次对整个列表进行排序可能会造成比较大的开销。

删除学生信息

这一块也相对来说比较简单,找到学生后,如果确认删除,则直接删除该学生即可。删除后其他学生的次序依然是有序的,无需再做调整。

查找学生信息

查找学生相关信息是通过 学号 遍历列表进行搜寻,找到后输出学生的相关信息。

 不过我在此基础上,对学生成绩进行了简单的统计,并通过图表的方式进行呈现。能够让老师或学生更直观地看到各科成绩的详细内容,找出自己的优势与不足,便于下次努力改进。(不过这里因为想把两个图拼在一个图上,因为不熟悉操作做了好久~)

bar1_colors = ['#7199cf','#4fc4aa','#e1a7a2']
labels = np.array(['作业1','作业2','作业3','作业4','测验1','测验2','实验1','实验2'])
name=['作业','测验','实验']
# 统计学生成绩等信息
def statistics_student(stu):
    #=======自己设置开始============
    #标签
    #数据个数
    dataLenth = len(stu["作业"])+len(stu["测验"])+len(stu["实验"])
    #数据
    all_scores = stu["作业"] + stu["测验"] + stu["实验"]
    data = np.array(all_scores)
    average_score=[np.mean(stu["作业"]),np.mean(stu["测验"]),np.mean(stu["实验"])]
  
    #========自己设置结束============
  
    angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
    data = np.concatenate((data, [data[0]])) # 闭合 # #将数据结合起来
    angles = np.concatenate((angles, [angles[0]])) # 闭合
  
    fig = plt.figure(figsize=(8, 4.2), dpi=80)
    ax = fig.add_subplot(121, polar=True)# polar参数!!121代表总行数总列数位置
    ax.plot(angles, data, 'bo-', linewidth=1)# 画线四个参数为x,y,标记和颜色,闲的宽度
    ax.fill(angles, data, facecolor='r', alpha=0.1)# 填充颜色和透明度
    ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties='SimHei')
    ax.set_title("{} 详细成绩雷达图".format(stu["姓名"]),fontproperties='SimHei',weight='bold', size='medium', position=(0.5, 1.11),
                     horizontalalignment='center', verticalalignment='center')
    ax.set_rlim(0,100)
    ax.grid(True)
    xticks = np.arange(len(average_score))  #生成x轴每个元素的位置
    ax=fig.add_subplot(133)
    ax.set_xticklabels(name, fontproperties='SimHei')
    ax.set_xticks(xticks)  #设置x轴上每个标签的具体位置
    ax.set_ylim([0, 100]) # 设置y轴范围
    ax.bar(xticks,average_score,color=bar1_colors)
    ax.set_title("{} 平均成绩柱状图".format(stu["姓名"]),fontproperties='SimHei')
    plt.show()

打印全体学生成绩信息

这一个功能实现也蛮简单,遍历学生列表,然后调用打印函数逐个进行打印输出即可,这里输出单个学生信息的时候就没有输出统计图的信息了。主要是考虑到人数过多时,输出图的话,可能会导致速度过慢,影响体验。输出完成后会简单统计一下一共有几个人。

课程成绩统计

在统计成绩这个模块中,由于数据在列表中已经是有序的了,所以最高分最低分,中位数的获取都比较容易。而平均分也可以很快得出。(其实我觉得,程序的整体结构和思路做好以后,功能模块的实现就方便得多了。)

同样地,在这里我也做了一个图形的统计,利用柱状图展示了各个分数段的人数,方便老师快速了解成绩的分布情况。然后利用了饼状图分析了 及格人数/不及格人数 的比例,因为在这里不及格的人数为 0,所以整块都是及格的蓝色。

画图的代码如下(有了上一张图的经验,这张就好多了):

## 绘制统计试图
def print_statistics_view(stu_list):
    ##### 数据设置
    range_number = [0,0,0,0,0]  #各分数段人数
    type_number = [0,0]          # 各类型人数[及格,不及格,缺考]
  
    for stu in stu_list:
        count_type(stu, type_number)
        count_range(stu, range_number)
    #### 开始绘图
    fig = plt.figure(figsize=(8, 4), dpi=85)  #整体图的标题
    colors = ['#7199cf', '#4fc4aa', '#00BFFF', '#FF7F50', '#BDB76B']
    #①在121位置上添加柱图,通过fig.add_subplot()加入子图
    ax = fig.add_subplot(121)  
    ax.set_title('各分数段人数统计', fontproperties='SimHei')  #子图标题
    xticks = np.arange(len(range_number))  #生成x轴每个元素的位置
    bar_width = 0.5  #定义柱状图每个柱的宽度
  
    #设置x轴标签
    score_range = ['[0,60)','[60,70)','[70,80)','[80,90)','[90,100]']
    ax.set_xticklabels(score_range) 
    ax.set_xticks(xticks)  #设置x轴上每个标签的具体位置
    #设置y轴的标签
    ax.set_ylabel('人数', fontproperties='SimHei')  
    ax.bar(xticks, range_number, width=bar_width, color=colors, edgecolor='none')  #设置柱的边缘为透明
    #②在122位置加入饼图
    ax = fig.add_subplot(122)
    ax.set_title('及格\不及格占比')
    # 生成同时包含名称和速度的标签
    type_labels = ['及格','不及格']
    pie_labels = ['{}:{}人'.format(type_name, number) for type_name, number in zip(type_labels, type_number)]
    # 画饼状图,并指定标签和对应颜色
    #解决汉字乱码问题
    matplotlib.rcParams['font.sans-serif']=['SimHei']  #使用指定的汉字字体类型(此处为黑体)
  
    ax.pie(type_number, labels=pie_labels, colors=colors, autopct='%1.2f%%')
    ax.axis('equal')   #保证饼图不变形
    plt.show()

保存学生信息到文件中

在保存到文件时,默认保存到程序目录下的 data_file 目录里面,用户可以手动输入文件名,也可以直接回车使用默认选项(防止用户懒得输入这么麻烦的东西_)。

# 文件头
STUDENT_LABEL = ['序号','姓名','学号','分数','排名','作业1','作业2','作业3','作业4', '测验1', '测验2', '实验1', '实验2']
FILE_DIR = './data_file/' #保存文件的目录,默认为当前文件下的data_file目录
# save to file保存到文件
def save_to_file(stu_list):
    print("\033[34m",end='')
    fn = input("请输入文件名(例如: a.csv, 直接回车则默认为[学生成绩信息.csv]) >> ")
    print('\033[0m',end='')
    if fn == '': # 默认选项
        fn = '学生成绩信息.csv'
    elif len(fn) < 5: # 该用户没有输入后缀名
        fn = fn + '.csv'
    elif fn[-4:] != '.csv': # 该用户没有输入后缀名
        fn = fn + '.csv'
    all_values = []
    for index, stu in enumerate(stu_list):
        '''
        一个stu字典实体序列化成我们想要的格式,便于保存到文件
        index为保存到文件后该实体的序号,与list的序号对应
        '''
        stu_value = [index, stu['姓名'], stu['学号'], stu['分数'], index+1]
        stu_value = stu_value + stu['作业'] + stu['测验'] + stu['实验']
        all_values.append(stu_value)
    with open(FILE_DIR+fn,'w+',newline='') as f:
        writer = csv.writer(f)#创建一个csv的写入器
        writer.writerow(STUDENT_LABEL)#写入标签
        writer.writerows(all_values) #写入样本数据
        f.close()
    print('\033[1;31m')  
    print("保存信息到["+FILE_DIR+fn+"]成功!")
    print('\033[0m')  

 用户输入自定义的文件名后,由于保存的是 CSV 格式的文件,因此需要简单修正一下用户输入的文件名(因为有时候可能没有输入后缀名之类的。),然后再读取列表的数据,保存到文件中,如下:

可以看到,由于列表的数据始终是有序的,因此排名与序号是对应的。

从文件中读取学生信息

从文件读取信息时,遵循的格式和保存的格式是一致的。与从文件中添加信息不同的是,该功能读取文件中所有的信息添加进一个新的列表,然后丢弃系统原有的列表,使用读取文件生成的新列表。

 同时,从文件读取信息时,也允许分数项缺失,如果缺失,则重新计算后存入列表中去。导入文件也提供了默认的文件:

# 从文件导入信息
# 需要遵循格式:['序号','姓名','学号','分数','排名','作业1','作业2','作业3','作业4', '测验1', '测验2', '实验1', '实验2']
def load_from_file():
    print("\033[34m",end='')
    fn = input("请输入文件路径(例如: C:/a.csv, 直接回车则默认为[./data_file/学生成绩信息.csv]) >> ")
    print('\033[0m',end='')
    file_path = FILE_DIR+'学生成绩信息.csv' # 默认选项
    if fn != '':
        file_path = fn
    stu_list = []
    n = 0
    with open(file_path) as csvfile:
        csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件
        next(csv_reader)  # 跳过文件头
        for row in csv_reader:  # 读取数据
            work       = [float(x) for x in row[5:9]] #转化作业成绩
            test       = [float(x) for x in row[9:11]] #转化测验成绩
            experiment = [float(x) for x in row[11:]] #转化实验成绩
            score = 0
            if row[3] == '':
                score = calc_score(work, test, experiment) # 考虑到成绩位置为空的情况,重新计算成绩。
            else:
                score = float(row[3])
            stu_info = {'姓名':row[1], '学号':row[2], '作业':work,
                    '测验':test, '实验': experiment, '分数':score}
            stu_list.append(stu_info) #
            n = n + 1
    # 如果读取的是本程序输出的,按理说不用排序
    # 但也可能是从其他文件读入的数据,所以还是得做一下排序。
    stu_list.sort(key=lambda d:(d["分数"],np.mean(d["作业"]),np.mean(d["测验"]),np.mean(d["实验"])), reverse = True) # 排好序
    print('\033[1;31m')  
    print("从文件["+file_path+"]导入成功!共 "+str(n)+" 条信息!")
    print('\033[0m')  

    return stu_list

退出

在退出的时候,我做了一个小提示,提示用户是否保存当前数据到文件中去。因为有时候如果不提醒用户的话,用户可能由于疏忽而忘记了保存到文件,一旦退出程序则数据就丢失了。

小结

这个项目的开发历时较长,因为我致力于将其打造得尽可能完善。虽然这只是一个小规模的项目,但要想在功能性和程序的健壮性上达到高标准,确实是一项挑战。

我必须承认,项目中的一些设计和实现决策是基于个人独立思考的结果,未经过广泛的市场调研或用户咨询,因此可能存在一些不周到之处。对此,我希望得到读者们的理解和宽容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《黑神话·悟空》是用什么编程语言开发的?

最近国内出了一款3A大作的游戏&#xff0c;凭借牛b的画面、文化底蕴、剧情&#xff0c;已经吸引了很多人入局&#xff0c;当然小孟也在第一时间尝鲜。 最直接的感受&#xff1a;效果牛b&#xff0c;画面牛b&#xff0c;游戏好玩。但是时间太忙&#xff0c;准备过年的放假的时候…

PMP–知识卡片--鱼骨图

鱼骨图由日本质量管理大师石川馨发明&#xff0c;也称因果图&#xff0c;原本用于质量管理。现在多用于问题整理。 在使用该工具时&#xff0c;把问题写在鱼骨的头上&#xff0c;然后召集同事&#xff0c;尽可能多的找出问题&#xff0c;大骨写大问题&#xff0c;中小骨写中小…

Web前端性能优化合集

简介 自互联网兴起以来&#xff0c;从最初的静态网页到如今的动态交互、单页应用&#xff08;SPA&#xff09;、PWA&#xff08;Progressive Web Apps&#xff09;等&#xff0c;互联网技术正在飞速发展&#xff0c;随着用户体验成为核心竞争力之一&#xff0c;前端性能直接影…

哪种电容笔更好用一点?2024开学季实测五款高性价比电容笔!

近年来&#xff0c;随着无纸化学习的日益普及&#xff0c;电容笔的重要性越来越凸显&#xff0c;但面对市场上数不清的电容笔种类和品牌&#xff0c;我们到底该选择哪种电容笔更好用一点呢&#xff1f;趁着即将开学&#xff0c;好多小伙伴都在寻找学习用品和数码好物之际&#…

Python Selenium实现自动化测试及Chrome驱动使用!

本文将介绍如何使用Python Selenium库实现自动化测试&#xff0c;并详细记录了Chrome驱动的使用方法。 通过本文的指导&#xff0c;读者将能够快速上手使用Python Selenium进行自动化测试。 并了解如何配置和使用Chrome驱动来实现更高效的自动化测试。 一、Python Selenium简…

2024年甘肃省安全员C证证考试题库及甘肃省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年甘肃省安全员C证证考试题库及甘肃省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

运动耳机哪个牌子好?五大高品质巅峰机型汇总!

​对于运动时享受音乐的朋友来说&#xff0c;耳机的舒适度至关重要&#xff0c;它直接影响到我们能否在运动中发挥最佳状态。无论是高端旗舰耳机还是性价比较高的入门级产品&#xff0c;长时间佩戴的不适感都可能干扰我们的运动节奏。因此&#xff0c;开放式耳机因其不入耳的设…

数据资产价值评价:开启数据要素市场的关键钥匙

数据资产价值评价&#xff1a;开启数据要素市场的关键钥匙 前言数据资产价值评价 前言 数据资产作为当今数字化时代的重要生产要素&#xff0c;其价值评价至关重要。数据资产的价值在于与应用场景的紧密结合&#xff0c;不同场景下数据所贡献的经济价值存在显著差异。例如&…

WIFI 模组8286驱动

原理图&#xff1a; 注&#xff1a;使用的数串口1的引脚&#xff0c;PA1是发送端引脚&#xff0c;PA3是接收端引脚&#xff0c;PA7串口的使能位。 1.0 WIFI模组驱动 驱动初始化函数&#xff1a; void WifiModuleDrvInit(void) {WifiGpioInit();WifiUartInit(115200);WifiDmaIn…

window系统如何适用redis

目录 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具

CSS3多行多栏布局

当前布局由6个等宽行组成&#xff0c;其中第四行有三栏&#xff0c;第五行有四栏。 重点第四行设置&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img {hei…

踩坑集之Video Processing Subsystem

问题描述 Video Processing Subsystem (VPSS) 功能强大&#xff0c;但我们在应用中只需要其中某个子功能。如果使用完整版本&#xff0c;资源消耗会非常大。VPSS将所有子功能封装在一起&#xff0c;所以我们将IP配置为仅包含CSC的模式&#xff0c;以为不需要的功能就不会影响系…

致远OA OCR票据识别组件

OCR票据识别 技术支持 技术大佬支持本文档 使用范围 任何票种信息&#xff0c;只要需要对接到oa底表中&#xff0c;就能够实现各种票种&#xff0c;各种字段的对接&#xff0c;包括票据识别&#xff0c;发票核验&#xff0c;适配各种票据 使用介绍 1 配置每种发票的ocr设…

【Nginx】快速入门

概述 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器。 特点是占有内存小&#xff0c;并发能力强&#xff0c;简单易配置&#xff0c;支持高达 50000 个并发连接数的响应。 作用 代理 正向代理&#xff1a; 反向代理&#xff1a; 负载均衡 Nginx提供的负载均衡策…

专题---自底向上的计算机网络(物理层)

目录 计算机网络概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 详细见http://t.csdnimg.cn/MY5aI http://t.csdnimg.cn/8Ipa4 http://t.csdnimg.cn/uvMxS 信道复用技术不仅在物理层有运用&#xff0c;在数据链路层也确实需要信道复用技术。‌ 数据链路层是…

推荐一个java企业级快速开发平台-JeeSite

文章目录 前言一、项目介绍二、技术选型基本技术框架其他技术框架分布式技术框架 三、项目特点四、功能介绍五、源码下载六、官方文档总结 前言 大家好&#xff0c;今天为大家推荐一个java 企业级系统快速开发平台&#xff0c;JeeSite。它是一个企业级快速开发解决方案&#x…

https://developer.nvidia.com/cuda-toolkit-archive

CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive

matplotlib color颜色全面指南

要想把数据表示得生动的趣&#xff0c;往往需要使用多种颜色来配合&#xff0c;才可以让数据得已区分开来。那么就来学习一下matplotlib的颜色。在matplotlib里主要使用一些简单的字母来表示颜色&#xff0c;比如&#xff1a; 参考&#xff1a; Matplotlib Color Tutorials L…

jmeter接口测试项目实战详解,零基础也能学

1.什么是jmeter&#xff1f; JMeter是100%完全由Java语言编写的&#xff0c;免费的开源软件&#xff0c;是非常优秀的性能测试和接口测试工具&#xff0c;支持主流协议的测试 2.jmeter能做什么&#xff1f; 1.JMeter是100%完全由Java语言编写的软件性能测试的GUI的测试工具&…

书生大模型实战营(第三期闯关大挑战)- 进阶岛 第六关 MindSearch CPU-only 版部署

0 项目介绍 书生大模型实战营三期进阶岛 增加了MindSearch 快速部署任务关卡。之前的任务是在彩蛋岛的任务&#xff0c;可能之前彩蛋岛的任务中用到了DuckDuckGoSearch 这个是国外网络才好访问&#xff0c;实际使用过程中需要通过一些魔法才能解决此任务。很多小伙伴卡在网络这…