Python 类与对象应用 —— 银行管理系统(双系统)
1 # 银行管理系统 2 3 4 """ 5 思考: 6 1.怎么随机产生不重复的6位数字? 7 2.怎么存储银行卡信息? 8 3.怎么引用自己写的模块? 9 10 介绍: 11 从早期的钱庄到现如今的银行,金融行业在不断地变革,随着科技的发展,计算机的普及, 12 计算机技术在金融行业得到了广泛的应用。 13 银行管理系统是一个集开户、查询、取款、存款、转账、锁定、解锁、退出等功能的管理系统。 14 15 操作:本程序有两个系统,分别是管理员系统和普通用户系统, 16 初始管理员账户:123456,密码:123456 17 18 知识点: 19 1.类和对象的使用:类的定义、属性和方法的调用、类方法和静态方法的封装和调用 20 2.字典的使用;本程序是有字典来存储数据的,包括字典的增、删、改、查、遍历 21 3.文件模块引用:我把本程序和之前写的程序(文本进度条)进行调用 22 4.循环/嵌套循环语句:while/ for 23 5.条件/嵌套条件语句:if/ elif/ else 24 6.跳转语句:break/ continue 25 7.函数封装:把单一重复的代码封装成一个函数 26 8.旗帜的使用:方便我们跳出多层循环体 27 28 不足(待改善): 29 1.本程序有一个bug还没改善:在普通用户登录操作输入金额时,不能输入字符,否则会报错 30 31 """ 32 33 34 # 定义一个类 =================================================================== 35 class Info: 36 37 # 定义一个字典,用于存储银行卡信息 38 __info = {'123456': ['周华', '(空)', '(空)', 0, '123456', '管理员']} 39 40 # 管理员账户 41 admin_account = '123456' # 缺点:不是私有属性,可以被外部调用 42 43 # 随机生成6位数账号(不重复) ================================================== 44 @staticmethod 45 def __random_num(min=100000, max=999999): 46 47 from random import randint # 导入random模块的randomint函数 48 Info.num = str(randint(min, max)) # 随机生成一个(100000-999999)的账户 49 50 if Info.__info == dict(): # 判断字典是否为空 51 return Info.num # 返回随机产生的账户 52 53 else: 54 # 调用账户查找函数,判断现在生成的随机账户是否与字典中的账户相同(保证唯一性) 55 if not Info.find_account(find=Info.num): # 如果不相同 56 return Info.num # 那就返回这个账户 57 58 else: # 如果有重复 59 Info.__random_num() # 那就在重新产生一个账户(递归函数) 60 return Info.num # 返回账户 61 62 # 账号开户 ==================================================================== 63 @classmethod 64 def create_account(cls, name='(空)', id_card='(空)', phone_num='(空)', money=0, password='(空)', state='(空)'): 65 66 Info.account = Info.__random_num() # 调用私有方法,随机生成6位数账户,并赋值 67 68 # 把账户信息添加到字典中(字典添加元素),注意不可以使用update()添加元素 69 Info.__info[Info.account] = [name, id_card, phone_num, money, password, state] 70 71 return Info.account # 返回新生成的账户 72 73 # 查找账户 =================================================================== 74 @staticmethod 75 def find_account(find, container=None): 76 if not container: # 判断传入的container是否为None 77 container = Info.__info # 如果为None,那就赋值 78 79 for i in container: # 字典遍历查找账户 80 if find == i: # 判断是否存在此账户 81 return True # 如果存在此账户,那就返回True 82 83 return None # 此返回值是:在字典中不存在此账户,返回None 84 85 # 查找密码 =================================================================== 86 @classmethod 87 def find_password(cls, account, password): 88 # 先判断账号是否存在 89 if not Info.find_account(find=account, container=Info.__info): 90 return None # 账户错误 91 92 # 再判断此账号的密码是否正确 93 if password == Info.__info[account][4]: 94 return True # 账户和密码正确 95 96 return False # 账户正确,密码错误 97 98 # 账户锁定 99 @staticmethod 100 def account_lock(account): 101 # 在账户信息里添加旗帜(说明此账户已被锁定) 102 Info.__info[account][5] = '已锁定' 103 104 # 账户解锁 105 @staticmethod 106 def account_unlock(account): 107 Info.__info[account][5] = '(空)' 108 109 # 判断账户是否被锁定 110 @staticmethod 111 def whether_account_lock(account): 112 113 # 判断账户是否被锁定 114 if '已锁定' == Info.__info[account][-1]: 115 return False 116 117 return True 118 119 # 账户销户 =================================================================== 120 @staticmethod 121 def remove_account(remove): 122 123 # 判断此账户是否存在 124 if Info.find_account(remove): 125 126 Info.__info.pop(remove) # 如果存在,就删除此账户 127 return True # 删除此账户并返回True 128 129 return None # 如果此账户不存在,就返回False 130 131 # 打印账户 =================================================================== 132 @staticmethod 133 def output_account(account, scope=None): 134 # 遍历打印账户信息 135 for i in Info.__info: 136 137 # 判断传入的参数是否为‘all’ 138 if scope == 'all': 139 account = i # 如果是‘all’,就赋值 140 141 # 打印账户信息 142 if account == i: 143 print(f'账户:{i}\t密码:{Info.__info[i][4]}', end='\t') 144 print(f'余额:{Info.__info[i][3]}¥\t姓名:{Info.__info[i][0]}', end='\t') 145 print(f'身份证:{Info.__info[i][1]}\t手机号:{Info.__info[i][2]}\t状态:{Info.__info[i][5]}') 146 147 # 修改普通账户信息 ========================================================== 148 @staticmethod 149 def change_account(account, position, info): 150 Info.__info[account][position] = info # 索引赋值 151 152 # 修改管理员账号 ============================================================= 153 @staticmethod 154 def change_admin_account(account, new_account): 155 156 # 把新的管理员账户保存进系统,(因为字典的特点是不可重复,所以键相同,就覆盖,如果键不同,就赋值产生新的元素) 157 Info.__info[new_account] = Info.__info[account] 158 159 # 如果键不同,就删除原管理员账号 160 if new_account != account: 161 Info.__info.pop(account) 162 163 # 把新账户啊设置成管理员 164 Info.admin_account = new_account 165 166 # 删库跑路 =================================================================== 167 @staticmethod 168 def clear_account(): 169 buf = Info.__info[Info.admin_account] # 管理员账户保存 170 Info.__info.clear() # 清空系统账户信息 171 Info.__info[Info.admin_account] = buf # 复原管理员账户 172 173 # 打印加载进度条 174 from loading import show_load 175 show_load(0.5) 176 177 # 打印普通账户信息 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 178 @staticmethod 179 def output_info(account): 180 print(f'账户:{account}\t姓名:{Info.__info[account][0]}\t余额:{Info.__info[account][3]}¥') 181 182 # 账户存款 ==================================================================== 183 @staticmethod 184 def user_depo(account, money): 185 Info.__info[account][3] += money 186 187 # 账户取款 ==================================================================== 188 @staticmethod 189 def user_withdrawal(account, money): 190 Info.__info[account][3] -= money 191 192 # 外部调用私有属性接口 ======================================================== 193 @staticmethod 194 def user_money(account): 195 return Info.__info[account][3] 196 197 198 # 定义一个菜单功能实现类(管理员) 199 class Realize: 200 201 # 打印标题 =================================================================== 202 @staticmethod 203 def show_title(info='', num=9, num1=0): 204 print(' ' * num1 + '=' * num + info + '=' * num) # 字符串拼接 205 206 # 管理员菜单打印 ============================================================== 207 @staticmethod 208 def admin_menu(): 209 Realize.show_title(info='银行管理系统(管理员)', num=4) 210 print('1.账号开户\t\t2.账户销户') 211 print('3.账户锁定\t\t4.账户解锁') 212 print('5.账户查询\t\t6.账户修改') 213 print('7.删库跑路\t\t0.退卡') 214 215 # 输入编号(选择菜单功能) ====================================================== 216 @staticmethod 217 def input_num(info=''): 218 print(info, end='') 219 return input() 220 221 # 判断账户是否存在 ============================================================ 222 @staticmethod 223 def account_whether_exist(info): 224 while True: 225 account = input(info) 226 227 # 如果账户存在 228 if Info.find_account(account): 229 return account 230 231 # 退出 232 elif account == 'q': 233 Realize.show_title(info='返回菜单') 234 return False 235 236 print(f'账户:{account}不存在!(返回:q)') 237 238 # 选择确认 =================================================================== 239 @staticmethod 240 def option_affirm(account, info, num=9, num1=0): 241 message = f'请确认是否对账户:{account},进行{info}(Y/N):' # 字符串拼接 242 243 while True: 244 buf = input(message) 245 246 # 确定 247 if buf == 'y' or buf == 'Y': 248 Realize.show_title(info=f'{info}成功', num=num, num1=num1) 249 return True 250 251 # 反悔 252 elif buf == 'n' or buf == 'N': 253 print(f'账户:{account},{info}失败!') 254 return False 255 256 # 输入有误 257 print('输入有误!请输入字母:Y/N') 258 259 # 账号开户 =================================================================== 260 @staticmethod 261 def set_up_account(): 262 # 输入开户信息 263 Realize.show_title(info='账号开户') 264 name = input('请输入您的姓名:') 265 id_card = input('请输入您的身份证:') 266 phone_num = input('请输入您的手机号码:') 267 password = input('请设置您的账户密码:') 268 269 # 保存账户信息 270 account = Info.create_account(name=name, id_card=id_card, phone_num=phone_num, password=password) 271 272 # 打印账户信息 273 print(f'账户:{account}\t密码:{password}\t姓名:{name}\t余额:0元') 274 Realize.show_title(info='开户成功') 275 276 # 账户销户 =================================================================== 277 @staticmethod 278 def del_account(): 279 Realize.show_title(info='账户销户') 280 281 # 如果账户不存在 282 account = Realize.account_whether_exist('请输入需要注销的账户:') 283 if not account: 284 return 285 286 Info.output_account(account) # 打印账户信息 287 288 # 管理员账户无法注销 289 if account == Info.admin_account: 290 print(f'{account}为管理员账户,无法注销!') 291 return 292 293 # 选择确认销户 294 if Realize.option_affirm(account=account, info='销户'): 295 Info.remove_account(account) # 销户 296 297 # 账户锁定 =================================================================== 298 @staticmethod 299 def frozen_account(): 300 Realize.show_title(info='账户锁定') 301 302 # 如果账户不存在 303 account = Realize.account_whether_exist('请输入需要锁定的账户:') 304 if not account: 305 return 306 307 # 管理员账户无法锁定 308 if account == Info.admin_account: 309 print(f'{account}为管理员账户,无法锁定!') 310 return 311 312 # 如果账户已锁定 313 if not Info.whether_account_lock(account): 314 print(f'账户:{account},已被锁定!') 315 return 316 317 # 锁定选择确认 318 if Realize.option_affirm(account=account, info='锁定'): 319 # 账户锁定 320 Info.account_lock(account) 321 322 # 账户解锁 =================================================================== 323 @staticmethod 324 def account_unlock(): 325 Realize.show_title('账户解锁') 326 327 # 如果账户不存在 328 account = Realize.account_whether_exist('请输入需要解锁的账户:') 329 if not account: 330 return 331 332 # 如果没有锁定 333 if Info.whether_account_lock(account): 334 print(f'账户:{account},未锁定,无需解锁!') 335 return 336 337 # 如果选择解锁 338 if Realize.option_affirm(account=account, info='解锁'): 339 Info.account_unlock(account) # 账户解锁 340 341 # 账户查询 =================================================================== 342 @staticmethod 343 def find_account_info(): 344 Realize.show_title('账户查询') 345 346 # 因为这里添加了‘all’,所以要单独处理 347 while True: 348 account = input('请输入需要查询的账户(全部:all):') 349 350 # 如果账户存在 351 if Info.find_account(account): 352 break 353 354 # 退出 355 elif account == 'q': 356 Realize.show_title(info='返回菜单') 357 return False 358 359 # 打印全部 360 elif account == 'all' or account == 'ALL': 361 break 362 363 print(f'账户:{account}不存在!(返回:q)') 364 365 # 打印系统所有账户信息 366 if account == 'all': 367 Info.output_account(account='参数无要求', scope='all') 368 return 369 370 # 单纯打印此账户信息 371 Info.output_account(account) 372 373 # 账户修改 =================================================================== 374 @staticmethod 375 def change_account_info(): 376 Realize.show_title('账户修改') 377 378 # 如果账户不存在 379 account = Realize.account_whether_exist('请输入需要修改的账户:') 380 if not account: 381 return 382 383 # 管理员特殊处理 384 if account == Info.admin_account: 385 while True: 386 new_account = input('请输入新的账号:') 387 388 # 如果修改成功 389 if Realize.option_affirm(account=account, info='账号修改', num=7, num1=1): 390 # 确认修改后赋值 391 Info.change_admin_account(account=account, new_account=new_account) 392 # 打印修改后账户信息 393 Info.output_account(new_account) 394 # 赋值 395 account = new_account 396 break 397 398 # 账户信息修改(可以封装到函数里) 399 while True: 400 # 打印账户信息修改菜单 401 Realize.show_title('账户修改') 402 print('1.修改姓名\t 2.修改身份证') 403 print('3.修改密码\t 4.修改手机号') 404 405 # 选择菜单功能 406 num = Realize.input_num(f'请账户{account}选择修改内容:') 407 408 # 1.修改姓名 409 if num == '1': 410 new_name = input('请输入新的姓名:') 411 # 参数传参赋值 412 info = '姓名修改' 413 index = 0 414 data = new_name 415 num = 7 416 space = 1 417 418 # 2.修改身份证 419 elif num == '2': 420 data = input('请输入新的身份证:') 421 # 参数传参赋值 422 info = '身份证修改' 423 index = 1 424 num = 6 425 space = 1 426 427 # 3.修改密码 428 elif num == '3': 429 data = input('请输入新的密码:') 430 # 参数传参赋值 431 info = '密码修改' 432 index = 4 433 num = 7 434 space = 1 435 436 # 4.修改手机号 437 elif num == '4': 438 data = input('请输入新的手机号:') 439 # 参数传参赋值 440 info = '手机号修改' 441 index = 2 442 num = 6 443 space = 1 444 445 # 返回 446 elif num == 'q': 447 break 448 449 # 其他 450 else: 451 print('编号输入有误!(退出:q)') 452 continue 453 454 # 如果修改失败 455 if not Realize.option_affirm(account=account, info=info, num=num, num1=space): 456 continue 457 458 # 修改成功后赋值 459 Info.change_account(account=account, position=index, info=data) 460 Info.output_account(account) # 打印赋值后信息 461 462 # 删库跑路 =================================================================== 463 @staticmethod 464 def clear_account(): 465 Realize.show_title('恢复出厂') 466 467 while True: 468 buf = input('请确认是否删库跑路(Y/N):') 469 470 if buf == 'Y' or buf == 'y': 471 Info.clear_account() 472 Realize.show_title('恢复出厂') 473 break 474 475 elif buf == 'N' or buf == 'n': 476 Realize.show_title('删库失败') 477 break 478 479 elif buf == 'q': 480 Realize.show_title('放弃删库') 481 break 482 483 print('输入有误!(返回:q)') 484 485 # 登录界面打印 ============================================================== 486 @staticmethod 487 def interface(): 488 489 while True: 490 Realize.show_title(info='账户登录') # 打印标题 491 whether = input('请问您是否有账户(Y/N):') 492 493 if whether == 'N' or whether == 'n': 494 print('很遗憾您还没有账户!!!') 495 print('快来找管理员开户吧!') 496 print('管理员账户:123456') 497 print('管理员密码:123456') 498 continue 499 500 elif whether == 'Y' or whether == 'y': 501 502 account = input('请输入账户:') # 输入账户 503 504 # 先判断账户是否正确 505 if not Info.find_account(find=account): 506 error_count = 1 # 记录输入错误的次数 507 508 while True: 509 print('账号输入错误!(返回:q)') # 打印错误提示语 510 account = input('请重新输入账户:') # 重新输入账户 511 512 # 判断系统里是否有此账户 513 if Info.find_account(find=account): 514 break # 如果有就停止输入 515 516 # 判断输入的次数能否被4整除 517 if error_count % 4 == 0: 518 buf = f'您已经输入错误{error_count + 1}次!' # 如果能被4整除,就打印提示语 519 Realize.show_title(info=buf, num=4) # 调用函数打印打印提示语 520 521 # 判断是否输入的账户是字符‘q’ 522 if account == 'q': 523 break # 如果为真,就跳出循环输入 524 525 error_count += 1 # 输入错误数累加 526 527 # 判断输入的账户是否为字符‘q’ 528 if account == 'q': 529 continue # 如果为真,就回到本次循环的开始 530 531 # 判断账户是否被锁定 532 if not Info.whether_account_lock(account): 533 print(f'此账户:{account} 已被锁定!\n请及时找管理员处理!') 534 continue 535 536 password = input('请输入密码:') # 输入密码 537 538 # 只有三次机会 539 for i in range(4): 540 541 # 再判断密码是否正确 542 if Info.find_password(account=account, password=password): 543 return account # 如果正确,就返回账户 544 545 else: 546 error = '输入密码错误!' 547 548 # 打印提示语 549 if i < 3: 550 print(error, end='') # 打印输入错误提示 551 print(f'还有{3 - i}次机会') 552 password = input('请重新输入密码:') 553 554 # 密码全输错了(账户锁定,管理员除外) 555 if account != Info.admin_account: 556 print(f'此账户:{account} 已被锁定!\n请及时找管理员处理!') 557 558 Info.account_lock(account) # 调用静态方法,说明此账户已被锁定 559 560 # 选择菜单功能 ================================================================ 561 @staticmethod 562 def select_function(num): 563 564 # 1.账号开户 565 if num == '1': 566 Realize.set_up_account() # 调用静态方法开户 567 568 # 2.账号销户 569 elif num == '2': 570 Realize.del_account() # 调用静态方法 571 572 # 3.账户锁定 573 elif num == '3': 574 Realize.frozen_account() # 调用静态方法 575 576 # 4.账户解锁 577 elif num == '4': 578 Realize.account_unlock() # 调用静态方法 579 580 # 5.账户查询 581 elif num == '5': 582 Realize.find_account_info() # 调用静态方法 583 584 # 6.账户修改 585 elif num == '6': 586 Realize.change_account_info() # 调用静态方法 587 588 # 7.删库跑路 589 elif num == '7': 590 Realize.clear_account() # 调用静态方法 591 592 593 # 定义一个普通账户菜单功能实现类(普通用户) 594 class User: 595 596 # 打印菜单 ==================================================================== 597 @staticmethod 598 def user_menu(): 599 Realize.show_title(info='银行管理系统(用户)', num=5) 600 print('1.取款\t\t\t\t2.余额') 601 print('3.存款\t\t\t\t4.转账') 602 print('0.退卡') 603 604 # 存款 ===================================================================== 605 @staticmethod 606 def deposit(account): 607 Realize.show_title('用户存款') 608 609 while True: 610 money = float(input('请输入存款金额:')) # 理想状态,如果输入负数和字符串会出现bug 611 if money < 0: 612 print('不能输入负数') 613 continue 614 615 break 616 617 Info.user_depo(account=account, money=money) # 金额增加 618 Info.output_info(account) # 打印账户信息 619 620 # 如果放弃存款 621 if not Realize.option_affirm(account=account, info='存款'): 622 Info.user_withdrawal(account=account, money=money) # 金额减少 623 return 624 625 # 取款 ===================================================================== 626 @staticmethod 627 def withdrawal(account): 628 Realize.show_title('用户取款') 629 630 while True: 631 Info.output_info(account) # 打印账户信息 632 money = float(input('请输入取款金额:')) # 理想状态,如果输入负数和字符串会出现bug 633 634 if money < 0: 635 print('不能输入负数') 636 continue 637 638 # 如果银行卡里的余额<取款余额 639 elif Info.user_money(account) < money: 640 print('已超出最大取款金额!') 641 continue 642 643 break 644 645 # 如果放弃存款 646 if not Realize.option_affirm(account=account, info='取款'): 647 return 648 649 Info.user_withdrawal(account=account, money=money) # 金额减少 650 651 # 转账 ===================================================================== 652 @staticmethod 653 def transfer(account): 654 655 Realize.show_title('账户转账') 656 657 # 被转账账户真是存在,且不是管理员 658 while True: 659 new_account = input('请输入转账的账户:') 660 661 # 如果被转账账户存在 662 if Info.find_account(new_account): 663 break 664 665 # 返回上一级 666 elif new_account == 'q': 667 Realize.show_title('转账失败') 668 return 669 670 # 不能对管理员转账 671 elif new_account == Info.admin_account: 672 print('无法给管理员账户转账!') 673 continue 674 675 print('此账户不存在,(返回:q)') 676 677 # 输入合适的转账金额 678 while True: 679 Info.output_info(account) # 打印账户信息 680 681 # 输入转账金额 682 money = float(input('请输入转账金额:')) 683 684 if money < 0: 685 print('不能输入负数') 686 continue 687 688 # 如果银行卡里的余额<取款余额 689 elif Info.user_money(account) < money: 690 print('已超出最大取款金额!') 691 continue 692 693 break 694 695 # 如果放弃转账 696 if not Realize.option_affirm(account=account, info='转账'): 697 return 698 699 # 转账成功 700 Info.user_withdrawal(account=account, money=money) # 金额减少 701 Info.user_depo(account=new_account, money=money) # 金额增加 702 703 # 菜单功能实现 =============================================================== 704 @staticmethod 705 def option_function(num, account): 706 # 1.取款 707 if num == '1': 708 User.withdrawal(account) 709 710 # 2.余额 711 elif num == '2': 712 Realize.show_title('显示余额') 713 Info.output_info(account) 714 715 # 3.存款 716 elif num == '3': 717 User.deposit(account) 718 719 # 4.转账 720 elif num == '4': 721 User.transfer(account) 722 723 724 # 功能实现(等价于C语言的主函数) ==================================================== 725 while True: 726 727 flag_break = 0 # 跳出循环旗帜 728 729 account = Realize.interface() # 判断是否有账户,并赋值 730 731 while not False: 732 733 if flag_break == 1: # 跳出两层循环 734 break 735 736 # 如果被锁定 737 if not Info.whether_account_lock(account): 738 print(f'此账户:{account} 已被锁定!\n请及时找管理员处理!') 739 break 740 741 # 打印加载进度条 742 from loading import show_load 743 show_load() 744 745 # 如果是管理员账户登录 746 if account == Info.admin_account: 747 748 while True: 749 Realize.admin_menu() # 打印管理员菜单 750 num = Realize.input_num('请管理员选择功能:') # 选择功能 751 752 if num == '0': 753 flag_break = 1 # 跳出两层循环旗帜 754 Realize.show_title(info='已退出管理员管理系统', num=4) 755 break 756 757 Realize.select_function(num) # 菜单功能实现 758 759 # 普通账户登录 760 else: 761 while True: 762 User.user_menu() # 打印用户菜单 763 num = Realize.input_num(f'请[{account}]选择功能:') # 选择功能 764 765 if num == '0': 766 flag_break = 1 # 跳出两层循环旗帜 767 Realize.show_title(info='已退出银行管理系统', num=5) 768 break 769 770 User.option_function(num=num, account=account) # 菜单功能实现
loading.py 文本进度条
1 # 文本下载进度条 2 3 """ 4 知识点: 5 1、time 模块使用 6 2、回到本行首位置'\r'与 替换本行末尾换行符end='' 7 3、显示百分号 8 4、字符串运算,只能用加法和乘法 9 5、while 循环使用 10 """ 11 12 13 def show_load(speed=0.1): 14 15 import time # 导入 time模块 16 17 # 变量定义 18 i = 1 19 a = '*' 20 # b = '.' 21 22 start = '='*10 + '加载中' + '='*10 # 字符串拼接 23 finish = '='*9 + '加载完成' + '='*9 24 25 # 打印开始下载 26 # print(start) 27 28 while True: 29 30 # 字符串拼接 31 progress_bar = '[{}{}{:.0%}]'.format(a * i, '.' * (19 - i), (i * 100 / 19) / 100) 32 33 # 打印进度条 34 print('\r' + progress_bar, end='') 35 36 # 循环结束条件 37 if i >= 19: 38 break # 跳出循环 39 40 i += 1 # 循环累加 41 42 time.sleep(speed) # 等待0.5秒 43 44 # 打印下载完成 45 # print('\n' + finish) 46 47 print()
运行结果;
分类:
Python 实用小程序
标签:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?