Python開發程式:選課系統-改良版

来源:http://www.cnblogs.com/lianzhilei/archive/2016/10/24/5985333.html
-Advertisement-
Play Games

程式名稱: 選課系統 角色:學校、學員、課程、講師要求:1. 創建北京、上海 2 所學校2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開3. 課程包含,周期,價格,通過學校創建課程 4. 通過學校創建班級, 班級關聯課程、講師5. 創建學員 ...


程式名稱: 選課系統

角色:學校、學員、課程、講師
要求:
1. 創建北京、上海 2 所學校
2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,周期,價格,通過學校創建課程 
4. 通過學校創建班級, 班級關聯課程、講師
5. 創建學員時,選擇學校,關聯班級
6. 創建講師角色時要關聯學校, 
7. 提供兩個角色介面
8. 學員視圖, 可以註冊, 交學費, 選擇班級,
9. 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績 
10. 管理視圖,創建講師, 創建班級,創建課程

11. 上面的操作產生的數據都通過pickle序列化保存到文件里

 

之前low的代碼:

移步-》》http://www.cnblogs.com/lianzhilei/p/5832691.html

想法:

選課系統是在第六節課學完面向對象時Alex給留的練習作業,當時寫的程式得了個B+,當時寫出了覺得自己還挺厲害的,不過現在看之前的代碼慘不忍睹,純粹為了實現要求而實現的功能,程式的擴展性很差;剛好最近複習到面向對象的內容,覺得這個作業確實不錯(邏輯性很強),準備重新寫一下,加上之前看過天帥的代碼框架,覺得有一些啟發,下麵就開始搞起來!

寫這個博客的目的,一是為了方便自己以後用到時去查詢,二是記錄下自己的思路,以後再看的時候,明白當前的想法(有想法的對比,才能看出自己進步了多少)

開始搞:

寫程式的第一步就會遇到問題,因為alex給出的要求確實太亂了,這麼多關聯關係根本理不清,首先先把要求換成自己能懂得話,把邏輯關係重新屢一下

先來個框架:

  三個視圖:學員視圖 講師視圖 管理視圖  三個視圖即為三個管理介面

  五個角色:學校、學員、課程、講師、班級  五個角色即需要定義5個類

把要求對應成自己看懂的話:

  ① 創建北京、上海 2 所學校    分析:定義學校類,通過類去創建學校實例
   創建linux , python , go 3個課程 ,linux\py 在北京開,go 在上海開  分析:定義課程類,通過課程類去創建課程實例

   ③ 課程包含,周期,價格,通過學校創建課程   分析:課程類里要包含周期、價格  課程實例通過學校類去創建

   班級關聯課程、班級關聯講師  分析:可以創建班級的時候需輸入關聯的課程,創建講師的時候需輸入關聯的班級;一個班級對應一個課程 一個班級對應一個講師

  ⑤ 通過學校創建班級, 班級關聯課程、講師   分析:跟④一樣

   創建學員時,選擇學校,關聯班級  分析:定義學員類,創建時選擇學校,選擇班級,通過學校類創建學員實例,班級類裡面要有包含學員的信息的字典

  ⑦ 創建講師角色時要關聯學校  分析:之前一樣,依然通過學校類去創建講師實例

  ⑧ 學員視圖 可以註冊, 交學費, 選擇班級    分析:學員選擇班級後,通過班級關聯的課程,列印課程的學費

  ⑨ 講師視圖, 講師可以.....bala....bala      分析:講師視圖登錄需要講師名,通過講師名可以找到對應的班級實例,班級實例里包含班級名,課程名,學員信息等

  註:一個班級對應一個課程 一個班級對應一個講師

    一個課程可有多個班級

    一個講師可教授多個班級

    一個學員可學習多個班級的課

分析下管理視圖:

        管理視圖具有的功能創建講師, 創建班級,創建課程,這些都是通過學校創建(即通過學校類的方法調用),除了創建以外我們還需要增加查詢講師、班級、課程的功能(查看相應的信息),管理視圖要有6個功能

分析下講師視圖:

        講師視圖可查看所授課的班級,班級學生信息  講師視圖具有2個功能

分析下學生視圖:

       學生視圖,要選擇學校,選擇班級(顯示班級的名稱,課程,價錢),添加到對應的班級內

咋做資料庫呢?!

        看看註裡面的內容就知道對應關係比較多,對應關係比較多就意味著,一個數據改了所有跟它有關係的數據都有變動,比如班級s14關聯講師alex,學生eric報名後,講師alex自己的班級學生信息里就要能查到eric的個人信息;當然如果用資料庫去做的話,非常簡單;but 咱還沒學資料庫呢,只能用文件的方式存在本地,如果存多個文件的話,一個文件修改另一個文件也跟著修改(互相關聯),所以為了簡便,就只定義一個偽資料庫;通過shelve模塊,存儲類型{“北京”:北京實例,“上海”:上海實例}

看我怎麼做的類定義(只看__init__):

內容最小的學員類只包含姓名,年齡,可擴展其他信息,關聯信息不再這存

class Student(object):
    '''學生類,包含姓名,年齡'''
    def __init__(self,student_name,student_age):
        self.student_name = student_name
        self.student_age = student_age

都跟它有關係,但是他是被關係的課程類:只包含周期,價格,名稱,可擴展其他信息,被關聯,啥關聯信息都不用存

class Course():
    '''定義課程類,包含名稱,價格,周期'''
    def __init__(self,course_name,course_price,course_time):
        self.course_name = course_name
        self.course_price = course_price
        self.course_time = course_time

跟三個都有關係,還一一對應(課程、講師)的班級類:④⑥  包含班級名,課程對應課程類(對應關係在本類里保存),班級學生成員字典,存放學生類,與講師關聯信息不再本類存

class Class(object):
    '''班級類,包含名稱,課程,學生'''
    def __init__(self,class_name,course_obj):
        self.class_name = class_name
        self.class_courese = course_obj
        self.class_student = {}         #學生字典 {學生名:學生實例}

關聯性單一,只跟班級相好的講師類:⑨  包含講師名、薪資;講師關聯班級(對應關係在本類保存)班級成員列表,存放班級名(做判斷,不會重覆);通過班級名查看班級類裡面的班級信息(包含學生),避免存雙份數據

class Teacher(object):
    '''講師類,定義teacher_name,teacher_salary,包含teacher_class'''
    def __init__(self, teacher_name, teacher_salary):
        self.teacher_name = teacher_name
        self.teacher_salary = teacher_salary
        self.teacher_calss = []                 #班級列表 [s14,15] 

    def teacher_add_class(self,class_name,class_obj):
        self.teacher_calss[class_name] = class_obj

內容最大,跟班級、課程、講師都有關係的學校類:  包含學校名,學校地址,存放課程實例、班級實例、講師實例,都是字典形式

class School(object):
    '''學校類,包含名稱,地址,課程,班級,教師'''
    def __init__(self,school_name,school_addr):
        self.school_name = school_name
        self.school_addr = school_addr
        self.school_course = {}             #學校所有的課程實例    {"課程名“:課程實例}
        self.school_class = {}        
        self.school_teacher = {}    #類型與course一致
        #self.school_student = {}          #可擴展學生  

 

框架有了,類有了,業務邏輯還不so easy?!

直接放目錄架構:

 

代碼區:

程式入口bin下的start.py:  註:判斷了系統環境,添加了環境變數,調用了主業務區main.py

import os
import sys
import platform

if platform.system() == "Windows":
    BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1])

else:
    BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1])

sys.path.insert(0,BASE_DIR)
#print(sys.path)

from core import main
from conf import settings

if __name__ == '__main__':
    obj = main.Manage_center()
    obj.run()
start.py

配置文件conf下的settings.py:  註:定義了資料庫路徑

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian

import os
import sys
import platform

if platform.system() == "Windows":
    BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1])
    database_path = os.path.join(BASE_DIR,"database")

else:
    BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1])
    database_path = os.path.join(BASE_DIR, "database")

school_db_file = os.path.join(database_path,"school")
settings.py

主業務core下的main.py:  註:定義了4個類,管理中心,學員視圖,講師視圖,學校視圖

import os
import sys
import shelve
from conf import settings
from modules.school import School


class Manage_center(object):
    def __init__(self):
        pass

    def run(self):
        while True:
            print("\n歡迎進入CLASS_SYSTEM系統\n"
                  "1 學生視圖\n"
                  "2 教師視圖\n"
                  "3 學校視圖\n"
                  "q 退出學員管理系統\n")
            user_choice = input("\033[34;0m請輸入您要登錄的視圖:\033[0m")
            if user_choice == '1':
                Manage_student()
            elif user_choice == '2':
                Manage_teacher()
            elif user_choice == '3':
                Manage_school()
            elif user_choice == 'q':
                print("\033[34;1m感謝使用學員管理系統,退出\033[0m")
                break
            else:
                print("\033[31;1m請輸入正確的選項\033[0m")

class Manage_school(object):
    '''學校管理視圖'''
    def __init__(self):
        if os.path.exists(settings.school_db_file+".dat"):      #shelve會生成三個文件,其中有.dat結尾
            self.school_db = shelve.open(settings.school_db_file)  #打開學校資料庫文件
            self.run_manage()       #運行管理視圖
            self.school_db.close()     #關閉資料庫文件
        else:
            print("\33[31;1m系統信息:初始化資料庫\33[0m")
            self.initialize_school()    #初始化資料庫
            self.run_manage()
            self.school_db.close()

    def initialize_school(self):
        '''實例化兩個學校北京/上海'''
        self.school_db = shelve.open(settings.school_db_file)
        self.school_db['北京'] = School('北京', '中國.北京')
        self.school_db['上海'] = School('上海', '中國.上海')

    def run_manage(self):
        '''運行學校管理視圖 '''
        while True:
            for key in self.school_db:
                print("學校名稱:",key)
            choice_school = input("\33[34;0m輸入選擇管理的學校名:\33[0m").strip()
            if choice_school in self.school_db:
                self.choice_school = choice_school
                self.school_obj = self.school_db[choice_school]
                while True:
                    print("\n歡迎來到老男孩%s校區\n"
                          "添加課程 add_course\n"
                          "增加班級 add_class\n"
                          "招聘講師 add_teacher\n"
                          "查看課程 check_course\n"
                          "查看班級 check_class\n"
                          "查看講師 check_teacher\n"
                          "退出程式 exit"% self.school_obj.school_name)
                    user_func = input('''\033[34;0m輸入要操作的命令:\033[0m''').strip()
                    if hasattr(self,user_func):
                        getattr(self,user_func)()
            else:
                print("\33[31;1m輸入錯誤:請輸入正確的學校名\33[0m")

    def add_course(self):
        course_name = input('''\033[34;0m輸入要添加課程的名稱:\033[0m''').strip()
        course_price = input('''\033[34;0m輸入要添加課程的價格:\033[0m''').strip()
        course_time = input('''\033[34;0m輸入要添加課程的時長:\033[0m''').strip()
        if course_name in self.school_obj.school_course:    #判斷課程是否已經添加過
            print("\33[32;1m課程存在\33[0m")
            self.school_obj.create_course(course_name, course_price, course_time)
            print("\33[32;1m課程更新完成\33[0m")
        else:
            self.school_obj.create_course(course_name,course_price,course_time)
            print("\33[32;1m課程添加成功\33[0m")
        self.school_db.update({self.choice_school: self.school_obj})    #更新資料庫數據

    def add_class(self):
        class_name = input('''\033[34;0m輸入要添加班級的名稱:\033[0m''').strip()
        course_name = input('''\033[34;0m輸入要關聯的課程:\033[0m''').strip()
        if class_name not in self.school_obj.school_class:
            if course_name in self.school_obj.school_course:
                course_obj = self.school_obj.school_course[course_name]
                self.school_obj.create_class(class_name,course_obj)
                self.school_db.update({self.choice_school: self.school_obj})  # 更新資料庫數據
                print("\33[32;1m班級創建成功\33[0m")
            else:
                print("\33[31;1m系統錯誤:關聯的課程不存在\33[0m")
        else:
            print("\33[31;1m系統錯誤:班級已經存在\33[0m")

    def add_teacher(self):
        teacher_name = input('''\033[34;0m輸入要招聘教師的名稱:\033[0m''').strip()
        teacher_salary = input('''\033[34;0m輸入教師的薪資:\033[0m''').strip()
        teacher_class = input('''\033[34;0m輸入要關聯的班級:\033[0m''').strip()
        if teacher_class in self.school_obj.school_class:       #判斷班級是否存在
            class_obj = self.school_obj.school_class[teacher_class]     #獲取班級名對應的實例
            if teacher_name not in self.school_obj.school_teacher:      #判斷招聘教師是否存在,不存在創建,存在更新
                self.school_obj.create_teacher(teacher_name,teacher_salary,teacher_class,class_obj)
                print("\33[32;1m新講師招聘成功\33[0m")
            else:
                self.school_obj.update_teacher(teacher_name, teacher_class, class_obj)
                print("\33[32;1m講師已經存在,信息更新完成\33[0m")

            self.school_db.update({self.choice_school: self.school_obj})  # 更新資料庫數據
        else:
            print("\33[31;1m系統錯誤:關聯的班級不存在\33[0m")

    def check_course(self):
        self.school_obj.show_course()

    def check_class(self):
        self.school_obj.show_class()

    def check_teacher(self):
        self.school_obj.show_teacher()

    def exit(self):
        self.school_db.close()
        sys.exit("\033[32;1m歡迎下次使用學員管理系統\033[0m")

class Manage_student(object):
    '''學生視圖'''
    def __init__(self):
        if os.path.exists(settings.school_db_file + ".dat"):  # shelve會生成三個文件,其中有.dat結尾
            self.school_db = shelve.open(settings.school_db_file)  # 打開學校資料庫文件
            self.run_manage()  # 運行管理視圖
            self.school_db.close()  # 關閉資料庫文件
        else:
            print("\033[31;1m資料庫文件不存在,請先創建學校\033[0m")
            exit()

    def run_manage(self):
        print("\n歡迎進入學員視圖")
        for key in self.school_db:
            print("學校名稱:", key)
        choice_school = input("\33[34;0m輸入選擇註冊的學校名:\33[0m").strip()
        if choice_school in self.school_db:
            self.choice_school = choice_school
            self.school_obj = self.school_db[choice_school]
            student_name = input('''\033[34;0m輸入學生的姓名:\033[0m''').strip()
            student_age = input('''\033[34;0m輸入學生的年齡:\033[0m''').strip()
            self.school_obj.show_class_course()
            class_choice = input('''\033[34;0m輸入上課的班級:\033[0m''').strip()
            if class_choice in self.school_obj.school_class:
                self.school_obj.create_student(student_name,student_age,class_choice)
                self.school_db.update({self.choice_school: self.school_obj})  # 更新資料庫數據
                print("\33[32;1m學生註冊成功\33[0m")
            else:
                print("\33[31;1m系統錯誤:輸入的班級不存在\33[0m")
        else:
            print("\33[31;1m系統錯誤:輸入的學校不存在\33[0m")


class Manage_teacher(object):
    '''教師視圖'''
    def __init__(self):
        if os.path.exists(settings.school_db_file + ".dat"):  # shelve會生成三個文件,其中有.dat結尾
            self.school_db = shelve.open(settings.school_db_file)  # 打開學校資料庫文件
            self.run_manage()  # 運行管理視圖
            self.school_db.close()  # 關閉資料庫文件
        else:
            print("\033[31;1m資料庫文件不存在,請先創建學校\033[0m")
            exit()

    def run_manage(self):
        for key in self.school_db:
            print("學校名稱:", key)
        choice_school = input("\33[34;0m輸入選擇學校名:\33[0m").strip()
        if choice_school in self.school_db:
            self.choice_school = choice_school
            self.school_obj = self.school_db[choice_school]
            teacher_name = input('''\033[34;0m輸入登錄講師的姓名:\033[0m''').strip()
            while True:
                if teacher_name in self.school_obj.school_teacher:
                    print("\n歡迎來到教師中心\n"
                          "查看班級 check_class\n"
                          "退出程式 exit" )
                    user_func = input('''\033[34;0m輸入要操作的命令:\033[0m''').strip()
                    if hasattr(self, user_func):
                        getattr(self, user_func)(teacher_name)
                else:
                    print("\033[31;1m講師不存在\033[0m")

    def check_class(self,teacher_name):
        self.school_obj.show_teacher_classinfo(teacher_name)

    def exit(self,*args):
        self.school_db.close()
        sys.exit("\033[32;1m歡迎下次使用學員管理系統\033[0m")
main.py

數據文件database:  註:不用管,自動初始化生成

註:不用管,自動初始化生成
database

模塊modules下的school: 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian
from modules.course import Course
from modules.classs import Class
from modules.teacher import Teacher
from modules.student import Student

class School(object):
    '''學校類,包含名稱,地址,課程,班級,教師'''
    def __init__(self,school_name,school_addr):
        self.school_name = school_name
        self.school_addr = school_addr
        self.school_course = {}             #學校所有的課程實例
        self.school_class = {}
        self.school_teacher = {}
        #self.school_student = {}

    def create_course(self,course_name,course_price,course_time):
        '''創建課程'''
        course_obj = Course(course_name,course_price,course_time)
        self.school_course[course_name] = course_obj

    def show_course(self):
        '''查看課程信息'''
        for key in self.school_course:
            course_obj = self.school_course[key]
            print("\33[32;1m課程:%s\t價格:%s\t周期:%s月\33[0m"%(course_obj.course_name,course_obj.course_price,
                                         course_obj.course_time,))

    def create_class(self,class_name,courese_obj):
        '''創建班級'''
        class_obj = Class(class_name,courese_obj)
        self.school_class[class_name] = class_obj

    def show_class(self):
        for key in self.school_class:
            class_obj = self.school_class[key]
            print("\33[32;1m班級:%s\t關聯課程:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name))

    def show_class_course(self):
        for key in self.school_class:
            class_obj = self.school_class[key]
            course_obj = class_obj.class_courese
            print("\33[32;1m班級:%s\t關聯課程:%s\t價格:%s\t周期:%s月\33[0m" % (class_obj.class_name, course_obj.course_name,
                                                                    course_obj.course_price,course_obj.course_time))

    def create_teacher(self,teacher_name, teacher_salary,class_name,class_obj):
        '''創建講師'''
        teacher_obj = Teacher(teacher_name, teacher_salary)
        teacher_obj.teacher_add_class(class_name,class_obj)
        self.school_teacher[teacher_name] = teacher_obj

    def update_teacher(self,teacher_name,class_name,class_obj):
        '''更新教師信息'''
        teacher_obj = self.school_teacher[teacher_name]
        teacher_obj.teacher_add_class(class_name,class_obj)

    def show_teacher(self):
        '''查看講師信息'''
        for key in self.school_teacher:
            teacher_obj = self.school_teacher[key]
            class_list = []
            for i in teacher_obj.teacher_calss:
                class_list.append(i)
            print("\33[32;1m講師:%s\t薪資:%s\t關聯班級:%s\33[0m" % (teacher_obj.teacher_name, teacher_obj.teacher_salary,
                                                          class_list ))
    def create_student(self,student_name,student_age,class_choice):
        '''註冊學生'''
        student_obj = Student(student_name,student_age)     #生成學生實例
        class_obj = self.school_class[class_choice]         #獲取學生所註冊班級的實例對象
        class_obj.class_student[student_name]=student_obj   #班級實例里添加學生信息
        self.school_class[class_choice] = class_obj         #學校班級字典更新

    def show_teacher_classinfo(self,teacher_name):
        teacher_obj = self.school_teacher[teacher_name]
        for i in teacher_obj.teacher_calss:
            class_obj = self.school_class[i]
            student_list = []
            for k in class_obj.class_student:
                student_list.append(k)
            print("\33[32;1m班級:%s\t關聯課程:%s\t學員:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name,
                                                            student_list))
student.py

模塊modules下的class:

class Class(object):
    '''班級類,包含名稱,課程,學生'''
    def __init__(self,class_name,course_obj):
        self.class_name = class_name
        self.class_courese = course_obj
        self.class_student = {}         #學生字典
class.py

模塊modules下的course:

class Course():
    '''定義課程類,包含名稱,價格,周期'''
    def __init__(self,course_name,course_price,course_time):
        self.course_name = course_name
        self.course_price = course_price
        self.course_time = course_time
course.py

模塊modules下的student:

class Student(object):
    '''學生類,包含姓名,年齡'''
    def __init__(self,student_name,student_age):
        self.student_name = student_name
        self.student_age =

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先我們要JavaWeb登陸的基本流程:JSP頁面發送請求——>Servlet——>Servlet通過調用方法從資料庫中得到數據並將結果返回頁面 我們先建立三個jsp頁面,包括login.jsp(登陸頁面)、index.jsp(顯示登陸成功後的信息)、error.jsp(登錄失敗的頁面),其中後兩個 ...
  • 1 概述 在進行ESB集成項目中,使用到了很多系統的介面,這些介面傳輸的數據大部分都採用了XML的格式,這樣在使用ESB開發服務時就需要對XML數據進行解析或拼接的操作,本文以項目中流程服務為例,講解一些常用的Dom4j對XML的操作。 2 名詞解釋 Dom4j:一個Java的XML API,用來讀 ...
  • 做python項目,需要用到mysql,一般用python-mysql,安裝時遇到錯誤提示如下: Command "python setup.py egg_info" failed with error code 1 Trace的關鍵信息是:sh: mysql_config: command not ...
  • 測試在進行一次性能測試的時候發現併發300個請求時出現了下麵的異常: HTTP Status 500 - Handler processing failed; nested exception is java.lang.OutOfMemoryError: unable to create new n ...
  • 【轉盤游戲】有一個轉盤,26個英文字母均勻分佈在轉盤邊緣,轉針初始位置在字母a,每次只能轉動到相鄰的字母,然後輸入一個由26個字母組成的字元串(最長100),不複位地依次轉動到相應的字母位置,問:一共需要轉多少次?編程實現。 Input:   輸入一個字元串,最長100,由26個英文字母組成。... ...
  • 前言: 我們在做自然語言學習的過程中使用Python進行編程。是用解析器的方式確實有些麻煩。在這裡給大家推薦一款集成開發環境IDE可以很方便的對Python進行項目管理,代碼自動提示,運行調試等。 簡介: 這裡不做其它IDE的推薦,直接推薦pycharm。它是大名頂頂的JetBrains公司出品的基 ...
  • 來源: POJ 註意: 總時間限制: 1000ms 記憶體限制: 65536kB 描述 魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若幹城市。 紅司令部,City 1,City 2,……,City n,藍司令部 兩軍的司令部都會製造武士。武士一共有 dragon 、 ...
  • 關於結構體的詳細分析 只定義結構體 是結構體的名字 定義結構體變數 定義結構體並同時定義結構體變數 關於指針的詳細分析 定義指針變數: 定義指針的指針變數: 賦初值: 關於 和`int p`區別: 如果是c,我推薦 這樣的寫法因為變數定義需要放在函數開始的地方. 如果是c++,我推薦 分行寫並初始化 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...