ATM项目开发

(1)在主程序文件中创建程序入口

(2)在核心代码文件(视图层)搭建程序框架

(3)进行代码功能分配

- ATM 项目根目录
- README.md 项目说明书 - start.py 项目启动文件的创建方式二,直接暴露在最外层 - conf 配置文件
- settings.py - lib 公共方法文件
- common.py - core(用户视图层) 存放用户视图层代码文件
- bank_src.py 银行操作代码
- user_src.py 用户操作代码 - db(数据处理层) 存放数据与数据处理层代码
- db_hander.py 数据处理层代码
- user_data 用户数据
- bank_data 银行数据 - log 存放日志文件
- user_log 用户日志
- flow_log 流水日志 - bin(启动文件目录) 存放启动文件的方式一,单独创建目录
- main.py

【一】功能概要

【1】注册

【2】登陆

【3】取款

【4】存款

【5】转账

【6】查看流水

【7】查看日志

【8】查看银行信息(查看自己的卡号、余额)

【9】初始化银行信息

【10】退出

【二】功能需求

【1】注册

(1)身份信息构成

  • 身份信息包括:用户名、密码、角色

(2)参数验证

  • 验证用户名是未注册过的用户名
  • 验证密码为三位数并且是数字类型

(3)信息存储

  • 将个人注册信息存储到指定文件 username_log.txt 文件中 日志格式为 当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 注册成功

【2】登陆

(1)参数验证

  • 验证用户名是已注册过的用户名
  • 验证密码为三位数并且是数字类型

(2)信息存储

  • 登陆成功后存储个人信息,以备后面不定期使用
  • 登陆成功后存储个人银行信息,以备后面不定期使用

(3)信息存储

  • 将个人登陆信息存储到指定文件 username_log.txt 文件中
  • 登陆成功 : 将个人注册信息存储到指定文件 username_log.txt 文件中 日志格式为 当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 登陆成功

【3】取款

(1)参数验证

  • 当前为登录用户且银行卡初始化成功
  • 验证支付密码必须是数字格式,并且符合三位
  • 验证银行卡号必须是数字格式,并且符合六位
  • 验证取款金额小于等于当前用户余额

(2)记录流水

  • 需记录当前取款流水记录,流水信息包括,流水格式为 当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 取出金钱 balance 余额为 res

(3)信息存储

  • 将个人银行信息存储到指定文件 username_flow.txt 文件中

【4】存款

(1)参数验证

  • 当前为登录用户且银行卡初始化成功
  • 验证支付密码必须是数字格式,并且符合三位
  • 验证银行卡号必须是数字格式,并且符合六位

(2)记录流水

  • 需记录当前存款流水记录,流水信息包括,流水格式为 当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 存入 balance 余额为 res

(3)信息存储

  • 将个人银行信息存储到指定文件 username_bank.txt 文件中

【5】转账

(1)参数验证

  • 当前为登录用户且银行卡初始化成功
  • 验证支付密码必须是数字格式,并且符合三位
  • 验证银行卡号必须是数字格式,并且符合六位
  • 验证取款金额必须大于0且小于等于当前用户余额

(2)记录流水

  • 需记录当前取款流水记录,流水信息包括

    • 流水格式为 当前用户 username 于 xx年xx月xx日 xx时xx分xx秒 向 target_username 转账 balance 余额为 res
    • 流水格式为 当前用户 target_username 于 xx年xx月xx日 xx时xx分xx秒 收到 username 转账 balance 余额为 res1

(3)信息存储

  • 将个人银行信息存储到指定文件 username_bank_log.txt 文件中

【6】查看流水

(1)参数验证

  • 当前为登录用户且银行卡初始化成功

【7】查看日志

(1)参数验证

  • 当前为登录用户且银行卡初始化成功

【8】查看银行信息(查看自己的卡号、余额)

(1)参数验证

  • 当前为登录用户且银行卡初始化成功

【9】激活

(1)银行信息构成

  • 银行信息包括:用户名、支付密码、余额、银行卡号

(2)参数验证

  • 验证支付密码必须是数字格式,并且符合三位
  • 验证银行卡号必须是数字格式,并且符合六位
  • 给予初识余额 1000 元

(3)信息存储

  • 记录日志到 username_flow.txt 中,日志格式为 username 于 xx年xx月xx日 xx时xx分xx秒 初始化成功 余额为 balance
  • 将个人银行信息存储到指定文件 username_flow.txt 文件中

【10】退出

  • 直接退出程序

【三】代码实现

【1】bin

  • 存放启动文件的方式一,单独创建目录
# author : heart
# blog_url : https://www.cnblogs.com/ssrheart/
# time : 2023/12/19
from core import register,login,check_flow,check_log,check_bank_info,back,get_balance,add_balance,transfer_balance,init_bank_info func_menu = '''
===================用户功能菜单=====================
1.注册
2.登陆
3.取款
4.存款
5.转账
6.查看流水
7.查看日志
8.查看银行信息(查看自己的卡号、余额)
9.激活银行卡
10.退出 ======================欢迎使用=======================
''' func_dict = {
'1': register,
'2': login,
'3': get_balance,
'4': add_balance,
'5': transfer_balance,
'6': check_flow,
'7': check_log,
'8': check_bank_info,
'9': init_bank_info,
'10': back
} def main():
while True:
print(func_menu)
func_id = input('请输入功能id:>>>').strip()
if func_id not in func_dict.keys():
print('功能不存在!')
continue
func = func_dict[func_id]
flag, msg = func()
if flag:
if msg == 'back':
break
print(msg)
else:
print(msg)
continue main()

【2】conf

  • 配置文件 - settings.py
# author : heart
# blog_url : https://www.cnblogs.com/ssrheart/
# time : 2023/12/19 import os BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# print(BASE_DIR) # D:\2023propygo\ATMProject\ATM3.0wjjtest def create_path(*args):
for path in args:
if not os.path.exists(path):
os.mkdir(path) path_list=[] DB_DIR =os.path.join(BASE_DIR,'db')
USER_DATA=os.path.join(DB_DIR,'user_data')
BANK_DATA =os.path.join(DB_DIR,'bank_data') LOG_DIR=os.path.join(BASE_DIR,'log')
USER_LOG=os.path.join(LOG_DIR,'user_log')
FLOW_LOG =os.path.join(LOG_DIR,'flow_log')
path_list.append(DB_DIR)
path_list.append(USER_DATA)
path_list.append(BANK_DATA)
path_list.append(LOG_DIR)
path_list.append(USER_LOG)
path_list.append(FLOW_LOG) create_path(*path_list)

【3】core

  • 核心代码

    • user_src.py
    # author : heart
    # blog_url : https://www.cnblogs.com/ssrheart/
    # time : 2023/12/19
    from db.db_hander import save_data,read_data
    import time
    from lib import create_data_format login_auth_dict={
    'username':'',
    'is_admin':'',
    'bank_id':'',
    'bank_pwd':'',
    'balance':'' } def login_auth(func):
    def inner(*args, **kwargs):
    if not login_auth_dict['username']:
    return False, f'请先登录!'
    if not login_auth_dict['bank_id'] and func.__name__ != 'init_bank_info':
    return False, f'请先激活银行卡!'
    return func(*args, **kwargs) return inner def get_user_pass():
    username = input('请输入用户名:>>>').strip()
    password = input('请输入密码:>>>').strip()
    return username, password def register():
    # (1)获取当前输入的用户名和密码
    username, password = get_user_pass()
    # (2)校验密码格式 -- 必须是数字并且是3位
    if not password.isdigit():
    return False, f'非法!'
    if len(password) != 3:
    return False, f'密码必须是3位数!'
    # (3)给身份,是管理员还是普通用户
    if username == 'heart' and password == '123':
    role = 'admin'
    else:
    role = 'normal'
    # (4)拼接数据格式
    # username|password|role
    user_data = create_data_format(username=username,password=password,role=role)
    # (5)保存用户数据
    # db/user_data/user_pwd.txt
    # username|password|role
    save_data(path=f'user_pwd.txt',data=user_data)
    # (6)构建日志信息
    # log/user_log/username_log.txt
    # 当前用户 username 于 time.strftime{"%x %X"}注册成功!
    user_log = create_data_format(tag='log',username=username,msg=f'注册成功!')
    save_data(path=f'{username}_log.txt',data=user_log)
    # (7)初始化银行信息
    # db/bank_data/username_bank.txt
    # username|bank_id|bank_pwd|balance
    bank_data = create_data_format(username=username,bank_id='None',bank_pwd='None',balance='None')
    save_data(path=f'{username}_bank.txt',data=bank_data)
    # (8)银行流水和日志
    # 当前用户username 于 time.strftime{"%x %X"} 开卡成功,但未激活
    # log/flow_log/username_flow.txt
    # 日志:log/user_log/username_log.txt
    flow_log = create_data_format(tag='flow',username=username,msg=f'开卡成功,但未激活!')
    save_data(path=f'{username}_flow.txt',data=flow_log)
    bank_user_log = create_data_format(tag='log',username=username,msg=f'开卡成功,但未激活!')
    save_data(path=f'{username}_log.txt',data=bank_user_log)
    # (9)返回注册成功的信息
    # 当前用户 username 于 time.strftime{"%x %X"} 注册成功
    return True,user_log
    # 登录 : 直接将用户信息从文件中取出,然后进行比对 用户名 - 密码 def login():
    username, password = get_user_pass()
    user_data=read_data(tag='login',path='user_pwd.txt')
    if username not in user_data:
    return False,f'请先注册!'
    if not password.isdigit():
    return False,f'密码必须是数字!'
    if len(password) !=3:
    return False,f'密码必须是三位数!'
    data = user_data.get(username)
    if password != data.get('password'):
    return False,f'密码错误!'
    login_auth_dict['username'] = username
    login_auth_dict['is_admin'] = data.get('role')
    userlogin_log = create_data_format(tag='log', username=username, msg=f'登录成功!')
    save_data(path=f'{username}_log.txt', data=userlogin_log)
    return True,userlogin_log # 查看流水
    @login_auth
    def check_flow():
    username = login_auth_dict['username']
    data_list = read_data(tag='flow', path=f'{username}_flow.txt')
    count = 0
    print(f"************* 流水打印开始 *************")
    for data in data_list:
    count += 1
    print(f'当前第{count}条流水 :>>> {data}')
    print(f"************* 流水打印结束 *************")
    return True, f'{username}流水打印完成!' # 查看日志
    @login_auth
    def check_log():
    username = login_auth_dict['username']
    data_list = read_data(tag='log', path=f'{username}_log.txt')
    count = 0
    print(f"************* 日志打印开始 *************")
    for data in data_list:
    count += 1
    print(f'当前第{count}条日志 :>>> {data}')
    print(f"************* 日志打印结束 *************")
    return True, f'{username}日志打印完成!' # 查看银行信息
    @login_auth
    def check_bank_info():
    username = login_auth_dict['username']
    data_info = read_data(tag='info', path=f'{username}_bank.txt')
    card_id = data_info.get('bank_id')
    balance = data_info.get('balance')
    return True, f'用户{username} 卡号为{card_id} 当前余额{balance} 元!' # 退出
    def back():
    print('欢迎再次使用!')
    return True, 'back'
    • bank_src
    # author : heart
    # blog_url : https://www.cnblogs.com/ssrheart/
    # time : 2023/12/19
    # 取款
    import time from .user_src import login_auth_dict
    from lib import create_data_format
    from db.db_hander import save_data, read_data target_user_data={'username':'',
    'bank_id':'',
    'bank_pwd':'',
    'balance':''} def login_auth(func):
    def inner(*args, **kwargs):
    if not login_auth_dict['username']:
    return False, f'请先登录!'
    if not login_auth_dict['bank_id'] and func.__name__ != 'init_bank_info':
    return False, f'请先激活银行卡!'
    return func(*args, **kwargs) return inner def outter(tag=None):
    if tag == 'get':
    def outer(func):
    def inner(*args, **kwargs):
    balance = input('请输入取款金额:>>>').strip()
    if not balance.isdigit():
    return False, '请输入数字!'
    if int(balance) > int(login_auth_dict['balance']):
    return False, '余额不足!'
    bank_id = input('请输入你的银行卡号:>>>').strip()
    if not bank_id.isdigit():
    return False, '请输入数字!'
    if len(bank_id) != 6:
    return False, '银行卡号必须是6位数!'
    if bank_id != login_auth_dict['bank_id']:
    return False, '银行卡号不正确!'
    bank_pwd = input('请输入你的银行卡密码:>>>').strip()
    if not bank_pwd.isdigit():
    return False, '请输入数字!'
    if len(bank_pwd) != 3:
    return False, '密码必须是3位数!'
    if bank_pwd != login_auth_dict['bank_pwd']:
    return False, '密码不正确!'
    return func(balance=balance, bank_id=bank_id, bank_pwd=bank_pwd, *args, **kwargs) return inner return outer
    elif tag == 'add':
    def outtter(func):
    def inner(*args, **kwargs):
    balance = input('请输入存款金额:>>>').strip()
    if not balance.isdigit():
    return False, '请输入数字!'
    bank_id = input('请输入你的银行卡号:>>>').strip()
    if bank_id != login_auth_dict['bank_id']:
    return False, '银行卡号不正确!'
    if not bank_id.isdigit():
    return False, '请输入数字!'
    if len(bank_id) != 6:
    return False, '银行卡号必须是6位数!'
    bank_pwd = input('请输入你的银行卡密码:>>>').strip()
    if bank_pwd != login_auth_dict['bank_pwd']:
    return False, '密码不正确!'
    if not bank_pwd.isdigit():
    return False, '请输入数字!'
    if len(bank_pwd) != 3:
    return False, '密码必须是3位数!'
    return func(balance=balance, bank_id=bank_id, bank_pwd=bank_pwd, *args, **kwargs) return inner return outtter @login_auth
    @outter(tag='get')
    def get_balance(**kwargs):
    balance = kwargs.get('balance')
    bank_id = kwargs.get('bank_id')
    bank_pwd = kwargs.get('bank_pwd')
    username = login_auth_dict["username"]
    res = int(login_auth_dict['balance']) - int(balance)
    login_auth_dict['balance'] = str(res)
    bankdata = create_data_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
    save_data(path=f'{username}_bank.txt', data=bankdata)
    bank_log_data = create_data_format(tag='flow', username=username, msg=f'取款{balance}元 剩余余额{res}元!')
    save_data(path=f'{username}_log.txt', data=bank_log_data)
    save_data(path=f'{username}_flow.txt', data=bank_log_data)
    return True, bank_log_data # 存款
    @login_auth
    @outter(tag='add')
    def add_balance(*args, **kwargs):
    username = login_auth_dict["username"]
    balance = kwargs.get('balance')
    bank_id = kwargs.get('bank_id')
    bank_pwd = kwargs.get('bank_pwd')
    res = int(login_auth_dict['balance']) + int(balance)
    login_auth_dict['balance'] = str(res)
    data1 = create_data_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
    save_data(path=f'{username}_bank.txt', data=data1)
    bank_log_data = create_data_format(tag='flow', username=username, msg=f'存款{balance}元 剩余余额{res}元!')
    save_data(path=f'{username}_log.txt', data=bank_log_data)
    save_data(path=f'{username}_flow.txt', data=bank_log_data)
    return True, bank_log_data def is_admin(func):
    def inner(*args,**kwargs):
    if login_auth_dict['is_admin'] == 'normal':
    return False,f'只有管理员才能转账!'
    return func(*args,**kwargs)
    return inner
    # 转账
    @login_auth
    @is_admin
    def transfer_balance():
    target_username = input('请输入对方的用户名:>>>').strip()
    target_user_data = read_data(path=f'{target_username}_bank.txt',tag='transfer')
    if target_user_data is None:
    return False, f'{target_username}不存在!'
    target_user_data['username'] = target_username
    target_user_data['bank_id'] = target_user_data.get('bank_id')
    bank_id = target_user_data['bank_id']
    bank_pwd = target_user_data['bank_pwd']
    username=login_auth_dict['username']
    if not target_user_data['username']:
    return False,f'{target_username}不存在!'
    transfer_money=input('请输入转账金额:>>>').strip()
    if not transfer_money.isdigit():
    return False,f'请输入数字!'
    transfer_money=int(transfer_money)
    if transfer_money <= 0:
    return False, '转账金额必须大于0!'
    if int(transfer_money) > int(login_auth_dict['balance']):
    return False,f'余额不足!'
    transfer_pwd=input('请输入你的银行密码:>>>').strip()
    if transfer_pwd != login_auth_dict['bank_pwd']:
    return False,'密码错误!'
    login_auth_dict['balance'] = int(login_auth_dict['balance']) - transfer_money
    res =login_auth_dict['balance']
    bank_log_data = create_data_format(tag='flow', username=username, msg=f'向 {target_username} 用户 转账{transfer_money}元 剩余金额{res}元!')
    save_data(path=f'{username}_log.txt', data=bank_log_data)
    save_data(path=f'{username}_flow.txt', data=bank_log_data)
    user1_bank_data = create_data_format(username=username, bank_id=bank_id, bank_pwd=bank_pwd, res=str(res))
    save_data(path=f'{username}_bank.txt', data=user1_bank_data)
    target_user_data['balance'] = int(target_user_data['balance']) + transfer_money
    res1=target_user_data['balance']
    bankdata = create_data_format(username=target_username, bank_id=bank_id, bank_pwd=bank_pwd, res1=str(res1))
    save_data(path=f'{target_username}_bank.txt', data=bankdata)
    transfer_log_data = create_data_format(tag='transfer', username=target_username, msg=f'收到转账{transfer_money}元 剩余金额{res1}元!')
    save_data(path=f'{target_username}_log.txt', data=transfer_log_data)
    save_data(path=f'{target_username}_flow.txt', data=transfer_log_data)
    return True,bank_log_data
    # 激活银行卡
    @login_auth
    def init_bank_info():
    bank_id = input('请输入你的银行卡号:>>>').strip()
    if not bank_id.isdigit():
    return False, '请输入数字!'
    if len(bank_id) != 6:
    return False, '银行卡号必须是6位数!'
    bank_pwd = input('请输入你的银行卡密码:>>>').strip()
    if not bank_pwd.isdigit():
    return False, '请输入数字!'
    if len(bank_pwd) != 3:
    return False, '密码必须是3位数!'
    data = login_auth_dict["username"]
    login_auth_dict['bank_id'] = bank_id
    login_auth_dict['bank_pwd'] = bank_pwd
    login_auth_dict['balance'] = '1000'
    bank_log_data = create_data_format(tag='flow', username=data,
    msg=f'初始化银行卡成功! 当前余额{login_auth_dict["balance"]} 元')
    save_data(path=f'{data}_flow.txt', data=bank_log_data)
    save_data(path=f'{data}_log.txt', data=bank_log_data)
    bank_data = create_data_format(username=data, bank_id=bank_id, bank_pwd=bank_pwd,
    balance=login_auth_dict['balance'])
    save_data(path=f'{data}_bank.txt', data=bank_data)
    return True, bank_log_data

【4】db

  • 存放数据与数据处理层代码

    • bank_data
    • user_data
    • db_hander.py
    # author : heart
    # blog_url : https://www.cnblogs.com/ssrheart/
    # time : 2023/12/19
    import functools
    import os
    from conf import * def create_path_format(path):
    # 用户名和密码: user_pwd.txt --- > db/user_data/user_pwd.txt
    if 'pwd' in path:
    path = os.path.join(USER_DATA, path)
    # 银行信息: username_bank.txt --- > db/bank_data/username_bank.txt
    elif 'bank' in path:
    path = os.path.join(BANK_DATA, path)
    # 日志信息: username_log.txt --- > log/user_log/username_log.txt
    elif 'log' in path:
    path = os.path.join(USER_LOG, path)
    # 流水信息: username_flow.txt --- > log/flow_log/username_flow.txt
    elif 'flow' in path:
    path = os.path.join(FLOW_LOG, path)
    else:
    return False, f'当前参数错误'
    return path def save_data(tag=None, path=None, data=None):
    # (1)保存文件的路径及文件名
    path = create_path_format(path)
    with open(path, mode='a', encoding='utf-8') as f:
    f.write(data + "\n") def read_data(tag=None, path=None):
    user_pwd_dict = {}
    user_bank_dict = {}
    user_flow_list = []
    user_log_list = []
    path = create_path_format(path)
    if not os.path.exists(path):
    return None
    with open(path, 'r', encoding='utf-8') as f:
    data = f.read()
    data_list = data.split('\n')
    data_list.pop() if tag == 'login':
    for data in data_list:
    username, password, role = data.split('|')
    user_pwd_dict[username] = {'password': password, 'role': role}
    if tag == 'info' or tag == 'transfer':
    for data in data_list:
    username, bank_id, bank_pwd, balance = data.split('|')
    user_bank_dict = {'username': username, 'bank_id': bank_id, 'bank_pwd': bank_pwd, 'balance': balance}
    return user_bank_dict
    if tag == 'flow':
    for data in data_list:
    user_flow_list.append(data)
    return user_flow_list
    if tag == 'log':
    for data in data_list:
    user_log_list.append(data)
    return user_log_list
    return user_pwd_dict

【5】lib

  • 公共方法文件common
# author : heart
# blog_url : https://www.cnblogs.com/ssrheart/
# time : 2023/12/19
import time def create_data_format(tag=None,**kwargs):
data = '|'.join(kwargs.values())
if tag == 'log' or tag =='flow':
data = f'当前用户 {kwargs.get("username")} 于 {time.strftime("%x %X")} :>>>>{kwargs.get("msg")}'
if tag =='transfer':
data = f'当前用户 {kwargs.get("username")} 于 {time.strftime("%x %X")} :>>>>{kwargs.get("msg")}'
return data

【6】log

  • 日志文件

    • user_log
    • flow_log

ATM2.0模块版的更多相关文章

  1. Moon.Orm 5.0(MQL版)及之前版本的开源计划

    开源综述:步步开源 Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布) Moon.Orm 5.0系列文章 Moon.Orm 5.0性能问题,将发言权交给你! 一.5.0目前的情况,步 ...

  2. 开放源代码的微微信.NET 0.8 版公布了

    微微信.NET 0.8 版公布了     A.源代码应用范围:         未认证的和经过认证的微信订阅号.微信服务号均可使用,本源代码的每个模块都提供全然的 ASP.NET C#源代码,绝对不含 ...

  3. Moon.Orm 5.0 (MQL版)

    Moon.Orm 5.0 (MQL版) 实战实例Moon.Orm 5.0 革命性的设计 打造最便捷的异步分页技术(提供下载) 摘要: 一.建一个项目(以WebForm为例)配置文件配置(注意您自己的路 ...

  4. Angular4.0.0正式版发布

    来源于angular4.0.0发布时的公告,译者:niithub 原文发布时间:Thursday, March 23, 2017 翻译时间:2017年3月24日 angular4.0.0正式版现在可以 ...

  5. Lucene 4.0 正式版发布,亮点特性中文解读[转]

    http://blog.csdn.net/accesine960/article/details/8066877 2012年10月12日,Lucene 4.0正式发布了(点击这里下载最新版),这个版本 ...

  6. 企业建站系统MiinCMP1.0.5 版公布!

    2014-5-4,在青年节,Juuluu公布了其企业建站系统的新版1.0.5,经过两周多的奋战,Juuluu团队为MiinCMP新浪云版的移植工作做了大量工作.1.0.5已可完美执行于国内免费的jav ...

  7. Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?

    Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最"企业"化的版本,也是有史以来改动最大的一个 Redi ...

  8. 唯品会Java开发手册》1.0.2版阅读

    <唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...

  9. Apache DolphinScheduler 3.0.0 正式版发布!

    ​  点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler   ​ 版本发布 2022/8/10 2022 年 8 ...

  10. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

随机推荐

  1. 【Spring】JdbcTemplate的使用方法

    概念和准备 什么是 JdbcTemplate Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 准备工作 引入相关 jar 包 在 spring 配置文件 ...

  2. Redis 应用场景之短信验证码

    应用场景 以 OSChina 账号注册 为例...讲错了请留言批评指正... 逻辑场景 用户操作: 用户输入手机号, 然后点击获取验证码. 前端逻辑: ajax 发起请求, 参数带上手机号. 后端逻辑 ...

  3. 支付宝当面付和微信付款码支付封装DLL

    项目中需要为客户对接支付宝的当面付和微信付款码支付.场景就是软件中生成金额订单,然后扫顾客的微信付款码或者支付宝的付款码完成收款.为此封装了此DLL,可以用在其他项目中,其他人也可以直接拿来用. 最主 ...

  4. GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

    前言   当前GStreamer是开源的多媒体框架,其适配后可以支持板卡的硬编码.硬解码,还提供RTSP服务器等功能,降低了音视频开发的门槛(转移到gstreamer配置和开发上了,但是跨平台),瑞芯 ...

  5. CentOS linux安装nginx

    1.下载nginx-1.21.3.tar.gz 及 nginx-upstream-fair-master.zip 2.上传nginx-upstream-fair-master至/app/server/ ...

  6. Cursor+playwright+mcp,好玩

    Cursor+playwright+mcp能干嘛,我就不多说,本文只讲怎么用上 第一步,安装下载Cursor.node.js,至于什么python环境,playwright网上一堆教程,自己查 第二步 ...

  7. Oracle、MySQL、SQL Server、PostgreSQL、Redis 五大数据库的区别

    以下是 Oracle.MySQL.SQL Server.PostgreSQL.Redis 五大数据库的对比分析,从用途.数据处理方式.高并发能力.优劣势等维度展开: 一.数据库分类 数据库 类型 核心 ...

  8. 为React组件库引入自动化测试:从零到完善的实践之路

    为什么我们需要测试? 我们的 React+TypeScript 业务组件库已经稳定运行了一段时间,主要承载各类UI展示组件,如卡片.通知等.项目初期,迫于紧张的开发周期,我们暂时搁置了自动化测试的引入 ...

  9. DOM基础操作小结

    最近一个多月都在看看前端的内容. 因为这半年都在做BI嘛, 感觉有些东西呀, 还是用前端来做会更加能满足客户的需求, 于是呢, 就网上找了一些资料, 学习了一波前端基础. 这里也是做个简单的笔记, 关 ...

  10. 【TensorRT 10 C++ inference example】最新版本TensorRT c++ api的推理部署教程

      TensorRT是英伟达推出的部署框架,我的工作经常需要封装我的AI算法和模型给到桌面软件使用,那么tensorRT对我来说就是不二之选.TensorRT和cuda深度绑定,在c++版本的推理教程 ...