基於python網路編程實現支持購物、轉賬、存取錢的信用卡系統

来源:http://www.cnblogs.com/wanghzh/archive/2016/06/24/5613122.html
-Advertisement-
Play Games

一、要求 二、思路 1.購物類buy 接收 信用卡類 的信用卡可用可用餘額, 返回消費金額 2.信用卡(ATM)類 接收上次操作後,信用卡可用餘額,總欠款,剩餘欠款,存款 其中: 1.每種交易類型不單獨處理金錢,也不單獨記錄流水賬,每種交易類型調用處理金錢的函數(傳入交易類型,交易金額) 2.處理金 ...


一、要求

 

 

二、思路

 

1.購物類buy

接收 信用卡類 的信用卡可用可用餘額,

返回消費金額

2.信用卡(ATM)類

接收上次操作後,信用卡可用餘額,總欠款,剩餘欠款,存款

其中: 1.每種交易類型不單獨處理金錢,也不單獨記錄流水賬,每種交易類型調用處理金錢的函數(傳入交易類型,交易金額)
    2.處理金錢的函數,調用配置文件中關於每種交易類型的加減錢和利率

返回本次操作後信用卡可用餘額,總欠款,剩餘欠款,存款

3.客戶端

銀行管理員註冊登陸
普通用戶註冊登陸
發送需求:註冊、登陸、交易類型、交易金額

4.伺服器端

調用購物類,創建購物對象(購物介面)
調用信用卡(ATM)類,處理還款,轉賬等操作,對利息按月記錄,寫入文件

5.定時任務

定時執行程式,以計算利息。

三、代碼

 

3.1配置文件

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))  #配置文件的上層目錄
DB_DIR=os.path.join(BASE_DIR,'db')        #數據文件夾
ADMIN=os.path.join(DB_DIR,'admin')
ALL_USERS=os.path.join(DB_DIR,'allusrs')
A=os.path.join(BASE_DIR,'db','s')
LOG=os.path.join(BASE_DIR,'log')


TRANSACTION={
    'repay':{'action':'plus','interest':0}, #還款
    'withdraw':{'action':'minus','interest':0.05},#取現
    'transfer':{'action':'minus','interest':0.05},#轉賬
    'consume':{'action':'minus','interest':0},#消費
    'saving':{'action':'plus','interest':0}  #存款
}

 

3.2公共類

3.2.1購物類

 

class buy:
    goods=[
            {"name": "電腦", "price": 1999},
            {"name": "滑鼠", "price": 10},
            {"name": "游艇", "price": 20},
            {"name": "美女", "price": 998},
        ]

    def __init__(self,money,consumption,shopping_cart,):
        self.money=money
        self.consumption=consumption
        self.shopping_cart=shopping_cart

    def  gouwu(self): #購物模塊
        print('您的當前餘額為:%d' %self.money)
        num=int(input('請輸入商品序號:'))
        num-=1
        if self.goods[num]["name"] in self.shopping_cart.keys():               #goods[num]["name"]取商品名
            self.shopping_cart[self.goods[num]["name"]]['n']+=1                 #商品數量+1
        else:
            self.shopping_cart[self.goods[num]["name"]]={"price":self.goods[num]["price"],'n':1,}  # 創建購物車字典   {keys{"price":價格,數量:1}}
        self.money-=self.shopping_cart[self.goods[num]["name"]]["price"]*self.shopping_cart[self.goods[num]["name"]]['n']       #單價*數量
        self.consumption+=self.shopping_cart[self.goods[num]["name"]]["price"]*self.shopping_cart[self.goods[num]["name"]]['n']

    def yichu(self):  #移除購物車模塊
        c=int(input(' 請輸入0/1選擇是否移除購物車商品, 移除請輸入1:'))
        if c==1:
            e=int(input(' 請輸入要移除的商品序號:'))
            d=self.goods[e-1]
            if d in self.shopping_cart.keys():              #判斷要移除的商品是否在購物車內
                self.shopping_cart.remove(d)          #移除商品
                self.money=self.money+self.goods[self.goods.index(d)]["price"]             #餘額增加
                self.consumption=self.consumption-self.goods[self.goods.index(d)]["price"]  #消費總額減少
            else:
                print('商品不存在')
    def chongzhi(self):  #充值模塊
        pay=int(input('請輸入充值金額'))
        self.money=self.money+pay
        print('您的當前餘額為:%d' % self.money)    #顯示當前餘額

    def main(self):
        print('商品清單:')
        for m,n in enumerate(self.goods,1):
            print(m)
            for v in n.values():
                print(v)
            print('=============')
        #消費總額清零
        self.consumption=0
        buy=True  #定義預設一直購物
        while buy:
            price=0  #定義初始價格
            b=1  #定義預設不退出購物或充值狀態
            if self.money>=price:

        #消費模塊;金錢大於貨物價格時,才能開始購物
                while self.money>=price:
        #計價模塊,有錢就可以一直購物
                    self.gouwu()
        #移除購物車商品模塊
                    self.yichu()
                    if self.money>=0:
                        print('您的當前餘額為:%d' %self.money)          #顯示當前餘額
                        b=int(input(' 請輸入0/1選擇是否繼續購物, 購物請輸入1:'))
                        if b==0:        #
                            break   #退出計價模塊
                if b==0:           #如果不購物
                    break          #不購物退出整個購物程式
        #充值模塊
            else:
                while self.money<price:          #金錢不足,可多次充錢,直到能買得起貨物
                    a=int(input(' 您的餘額不足,請輸入0/1選擇是否充值,充值請輸入1:'))
                    if a==1:
                        self.chongzhi()
                    else:
                        break           #退出充值模塊
                    if a==0:
                        break           #不充值退出程式
        #列印購物車商品名、商品價格、消費總額、餘額
        print('您的消費清單為:')
        for m,n in self.shopping_cart.items():
            print(m,n['price'],n['n'])
                    #列印消費清單
            print('=============')
        print('您的當前餘額為:%d,您的消費總額為:%d' % (self.money,self.consumption) )            #列印消費總額
        return self.consumption

 

3.2.2 信用卡ATM類

 

class Atm:
    credit=15000  #信用卡額度
    def __init__(self,balance,debt,remaining_debt,interest,saving,id):
        self.id=id             #信用卡id
        self.balance=balance     #信用卡可用金額
        self.debt=debt           #總欠款
        self.remaining_debt=remaining_debt #剩餘欠款
        self.interest=interest      #手續費
        self.saving=saving     #存款
        self.now_time=time.strftime("%Y-%m-%d %H:%M:%S")
        self.now_data=time.strftime("%Y-%m")
        self.struct_time=time.gmtime(time.time())
        if self.struct_time.tm_mday>22:
            self.now_data=self.struct_time.tm_year+'-'+str(int(self.struct_time.tm_mon)+1)

    def account_info(self):#列印賬戶信息
       return '賬戶id%s 信用卡額度%s;信用卡可用金額%s;剩餘欠款%s;'%(self.id,self.credit,self.balance,self.remaining_debt,)
    def ret_account_info(self):
        return [self.id,self.credit,self.balance,self.debt,self.remaining_debt,self.interest]
    def repay(self,amount):#還款
        self.handel_money('repay',amount)
    def withdraw(self,amount): #取現
        self.handel_money('withdraw',amount)
    def transfer(self,amount): #轉賬
        self.handel_money('transfer',amount)
    def consume(self,amount):  #消費
        self.handel_money('consume',amount)
    def saves(self,amount):
        self.handel_money('saving',amount)
    def transaction(self,a,amount):
        dic={
            '1':self.repay,
            '2':self.withdraw,
            '3':self.transfer,
            '4':self.consume,
            '5':self.saves
        }
        print("debug: a:",type(a),"amount:",type(amount))

        print(a)
        print(dic[a])
        print(dic["5"])
        dic[a](amount)
        print("end debug")

    def handel_money(self,transaction,amount): #交易類型,
        amount=int(amount)
        interest=amount*settings.TRANSACTION[transaction]['interest'] #手續費計算
        if settings.TRANSACTION[transaction]['action']=='plus':

            if amount<=self.remaining_debt:
                self.remaining_debt-=amount
                self.balance+=amount
            else:
                self.balance+=self.remaining_debt
                self.remaining_debt=0
                self.saving+=amount-self.remaining_debt
        else:

            if self.saving<amount:
                self.saving=0
                a=amount-self.saving
                self.balance-=a+interest-self.saving
                # self.debt+=amount+interest
                self.remaining_debt+=a+interest
        a='time:%s id:%s transaction: %s amount:%s interest %s \n'%(self.now_time,self.id,transaction,amount,interest)
        print(a)
        mulu=os.path.join(settings.ALL_USERS,self.id)
        path_name_liushui=os.path.join(mulu,str(self.id)+'name_liushui',str(self.now_data))

        with open(path_name_liushui,'a')as f:          #記錄流水信息
            f.write(a)

        s=[self.balance,self.debt,self.remaining_debt,self.interest,self.saving,]     #更新基本信息
        path_name_base=os.path.join(mulu,str(self.id)+'name_base')
        pickle.dump(s,open(path_name_base,'wb'))

 3.3伺服器端:

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

import sys,os
import hashlib
import pickle
import time
import socketserver
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from config import settings
from lib import modules
from lib.modules import *

class Myserver(socketserver.BaseRequestHandler):

    def md5(self,pwd):
        '''
        對密碼進行加密
        :param pwd: 密碼
        :return:
        '''
        hash=hashlib.md5(bytes('xx7',encoding='utf-8'))
        hash.update(bytes(pwd,encoding='utf-8'))
        return hash.hexdigest()


    def login(self,usrname,pwd,x):
        '''
        登陸
        :param usrname: 用戶名
        :param pwd: 密碼
        :return:是否登陸成功
        '''
        conn=self.request
        if x=='1':
            path_name_pwd=os.path.join(settings.ADMIN,usrname)
        else:
            mulu=os.path.join(settings.ALL_USERS,usrname)
            path_name_pwd=os.path.join(mulu,usrname+'name_pwd')
        s=pickle.load(open(path_name_pwd,'rb'))
        if usrname in s:
             if s[usrname]==self.md5(pwd):        #和加密後的密碼進行比較
                return True
             else:
                return False
        else:
            return False


    def regist(self,usrname,pwd,x):
        '''
        註冊
        :param usrname: 用戶名
        :param pwd: 密碼
        :return:是否註冊成功
        '''

        conn=self.request
        if x=='1':
            mulu=os.path.join(settings.ADMIN,usrname)
        else:
            mulu=os.path.join(settings.ALL_USERS,usrname)


        if os.path.exists(mulu):
             return False
        else:
            os.mkdir(mulu)
            s={}
            s[usrname]=self.md5(pwd)
            path_name_pwd=os.path.join(mulu,usrname+'name_pwd')
            pickle.dump(s,open(path_name_pwd,'wb'))
            path_name_base=os.path.join(mulu,usrname+'name_base')
            pickle.dump([15000,{},0,0,0],open(path_name_base,'wb'))
            path_name_liushui=os.path.join(mulu,usrname+'name_liushui')
            os.mkdir(path_name_liushui)
            return True

    def user_identity_authentication(self,usrname,pwd,ret,x):
        '''
        判斷註冊和登陸,並展示用戶的詳細目錄信息,支持cd和ls命令
        :return:
        '''
        conn=self.request
        if ret=='1':
            r=self.login(usrname,pwd,x)
            if r:
                conn.sendall(bytes('y',encoding='utf-8'))
            else:
                conn.sendall(bytes('n',encoding='utf-8'))
        elif ret=='2':
            # print(usrname,pwd)
            if x=='1':
                r=self.regist(usrname,pwd,x)
            else:   #用戶註冊
                s=[0,1]
                pickle.dump(s,open(settings.A,'wb'))
                while True:
                    ret=pickle.load(open(settings.A,'rb'))
                    if ret[0]==0:
                        time.sleep(30)
                        continue
                    elif ret[0]==1 or ret[0]==2:
                        break  #預設值已更改,銀行管理員已操作

                if ret[0]==1:  #如果管理員同意
                    r=self.regist(usrname,pwd,x)
                else:
                    r=0
                s=[0,0]
                pickle.dump(s,open(settings.A,'wb'))
            if r:
                conn.sendall(bytes('y',encoding='utf-8'))
            else:
                conn.sendall(bytes('n',encoding='utf-8'))
    def interactive(self,usrname):  #進行交互
        conn=self.request
        while True:
            c=conn.recv(1024)  #接收用戶交互選項
            r=str(c,encoding='utf-8')
            mulu=os.path.join(settings.ALL_USERS,usrname)
            path_name_base=os.path.join(mulu,usrname+'name_base')
            s=pickle.load(open(path_name_base,'rb'))

            #列印賬戶信息
            obj=modules.Atm(s[0],s[1],s[2],s[3],s[4],usrname)  #Atm對象
            a=obj.account_info() #接收賬戶信息
            conn.sendall(bytes(a,encoding='utf-8'))

            b=obj.ret_account_info()



            if r== '4':
                buy_obj=modules.buy(b[2],0,{})
                amount=buy_obj.main()
            elif r=='q':
                break
            else:
                s=conn.recv(1024)
                amount=str(s,encoding='utf-8')

            obj.transaction(r,amount)


        pass


    def handle(self):
        conn=self.request
        x=conn.recv(1024)
        x=str(x,encoding='utf-8')
        conn.sendall(bytes('收到用戶類別',encoding='utf-8'))
        while True:
            if x=='1' or x=='2':
                b=conn.recv(1024)
                ret=str(b,encoding='utf-8')
                conn.sendall(bytes('b ok',encoding='utf-8'))
                c=conn.recv(1024)
                r=str(c,encoding='utf-8')
                usrname,pwd=r.split(',')
                print(usrname,pwd)
                self.user_identity_authentication(usrname,pwd,ret,x) #登陸或註冊驗證
                if x=='2':#普通用戶身份驗證成功後
                    self.interactive(usrname)

                    pass

                break
            elif x=='q':
                break

if __name__=='__main__':
    sever=socketserver.ThreadingTCPServer(('127.0.0.1',9999),Myserver)
    sever.serve_forever()

3.4 用戶端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
本程式作為用戶或銀行管理員的入口,其中c=1代表銀行管理員,c=2代表普通用戶
'''
import pickle
import sys
import time
import os
import socket
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from config import settings
from lib import *
from lib.modules import *

def login(usrname,pwd):
    '''
    登陸
    :param usrname:用戶名
    :param pwd:密碼
    :return:是否登陸成功
    '''
    obj.sendall(bytes(usrname+','+pwd,encoding='utf-8'))
    ret=obj.recv(1024)
    r=str(ret,encoding='utf-8')
    if r=='y':
        return 1
    else:
        return 0

def regist(usrname,pwd,x):
    '''
    註冊
    :param usrname:用戶名
    :param pwd:密碼
    :return:是否註冊成功
    '''
    obj.sendall(bytes(usrname+','+pwd,encoding='utf-8'))

    ret=obj.recv(1024)
    r=str(ret,encoding='utf-8')
    if r=='y':
        return 1
    else:
        return 0
def user_identity_authentication(usrname,pwd,x):
    '''
    選擇登陸或註冊,展示用戶的詳細目錄信息,支持cd和ls命令
    :return:
    '''
    a=input('請選擇1.登陸 2.註冊')
    obj.sendall(bytes(a,encoding='utf-8'))
    obj.recv(1024)
    if a=='1':
        ret=login(usrname,pwd)
        if ret:
            print('登陸成功')
            return 1
        else:
            print('用戶名或密碼錯誤')
            return 0
    elif a=='2':
        ret=regist(usrname,pwd,x)
        if ret:
            print('註冊成功')
            return 1
        else:
            print('用戶名已存在或銀行管理員拒絕')
            return 0
def main(x):
    usrname=input('請輸入用戶名')
    pwd=input('請輸入密碼')
    if user_identity_authentication(usrname,pwd,x): #如果驗證身份成功
        if x=='1':   #處理用戶註冊信息

            while True:
                s=pickle.load(open(settings.A,'rb'))
                if s[1]==0:
                    time.sleep(30)
                    continue
                elif s[1]==1:
                    while True:
                        a=input('用戶請求註冊,輸入1同意,2拒絕')
                        if a=='1':
                            s=[1,0]
                            pickle.dump(s,open(settings.A,'wb'))
                            break
                        elif a=='2':
                            s=[2,0]
                            pickle.dump(s,open(settings.A,'wb'))
                            break
                        else:
                            print('輸入有誤')
                    break
        else:  #普通用戶登陸後
            interactive()  #進行交互


def interactive():
    while True:
        a=input('請選擇 1.還款 2.取現 3.轉賬 4.消費 5.存錢  q退出')
        obj.sendall(bytes(a,encoding='utf-8'))
        r=obj.recv(1024) #接收賬戶信息
        ret=str(r,encoding='utf-8')
        print(ret)
        if a !='4'and a !='q':
            b=input('請輸入金額')
            obj.sendall(bytes(b,encoding='utf-8'))
        elif a=='q':
            break



obj=socket.socket() #創建客戶端socket對象
obj.connect(('127.0.0.1',9999))
while True:
    x=input('請選擇1.銀行管理員 2.用戶 q、退出')
    obj.sendall(bytes(x,encoding='utf-8'))
    obj.recv(1024)    #確認收到用戶類別
    if x=='1' or x=='2':
        main(x)
        break
    elif x=='q':
        break
    else:
        print('輸入有誤請重新輸入')

obj.close()

 3.5定時任務

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os,sys
import json,pickle
import time
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from config import settings



def main():
    card_list = os.listdir(settings.ALL_USERS)
    for card in card_list:
        basic_info = pickle.load(open(os.path.join(settings.ALL_USERS, card, card+'name_base')))
        struct_time = time.localtime()

        # 迴圈賬單列表,為每月的欠款計息。並寫入到當月賬單中
        for item in basic_info['debt']:
            interest = item['total_debt'] * 0.0005
            if basic_info[4] >= interest:
                basic_info[4] -= interest
            else:
                temp = interest - basic_info[4]
                basic_info[4]=0
                basic_info[0] -= temp
                pickle.dump(
                        basic_info,
                        open(os.path.join(settings.ALL_USERS, card, card+'name_base'),'w')
             )

        # 如果當前等於10號(9號之前)
        #   當前餘額為負值,則將值添加到賬單列表中,開始計息,同時,本月可用額度恢復。
        date = time.strftime("%Y-%m-%d")
        if struct_time.tm_mday == 11 and basic_info[2]>0:
            dic = {'date': date,
                   "total_debt":  basic_info[2],
                   "balance_debt": basic_info[2],
                   }
            basic_info[1].append(dic)
            # 恢復可用額度
            basic_info[0] = 15000
        pickle.dump(
            basic_info,
            open(os.path.join(settings.ALL_USERS, card, card+'name_base'),'w')
             )


def run():
    main()

  

 

 

  

 


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

-Advertisement-
Play Games
更多相關文章
  • EF和SqlHelper 簡單三層 EF生成sql,再調用ado.net訪問資料庫,最後使結果對象具體化. 之前的SqlHelper 簡單三層的寫法,拼接sql語句字元串,再調用ado.net訪問資料庫,最後也是把結果轉換為對象. 明顯的區別:sql語句的產生,EF是SQL查詢命令和 LINQ 查詢 ...
  • 前言 老規矩,任何技術的入門我通常都會總結增刪改查,本文我就通過HttpWebRequest和SolrNet的方式實現Solr最基礎的增刪改查(CURD)。對於自己的完整項目,同時不想過於依賴第三方類庫的則通過Http介面的方式來調用Solr。 當然也有人喜歡調用第三方的類庫,簡單方便,不需要自己處 ...
  • C#本質論和CLR via C#兩本好書,周老師可能是俗務纏身,太忙了吧,翻譯得只能讓人呵呵了。 你要是忙,別接那麼多活好不啦。 現在都在說供給側改革,都在大力提倡工匠精神,我們做技術的,還是踏實點好,對不啦? 對照一下李建忠老師翻譯的那一版CLR via C#,差距啊。 這裡,僅把隨手發現的幾個問 ...
  • 首先,我們定義一個Student類來測試. 在這樣一個數據中. 我們發現,如果使用自帶的 Distinct ,發現得數據依然是一樣,並沒有想象中的去除重覆。 以下,給出幾個解決方案。 第一種: 繼承EqualityComparer 我們新建一個類。如下。且必須重寫父類中的抽象方法。Equals和Ge ...
  • 一、背景 這幾天在維護公司的一個項目,嗯…到現在七八年沒人動過了(也是老古董了),都說N年前的代碼碰不得 處處是坑 不能挖坑還得一步一步的填坑,恰好今天就填了一坑 此處作為記錄 供以後翻閱,對代碼除了有些看不懂或者說是很凌亂之外,其他都還行(沒註釋、有註釋的地方是自動生成的英文註釋…..、包含 各種 ...
  • 組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織 組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織 組織者組織組織者組織組織者組織組織者組織組織者組織組織者組織 組織者組織組織者組織組織者組織組織者組織組織 ...
  • 本文只是基礎代碼片段,直接先寫 結論: C# DateTime 時間相減 —— 和 時區無關,只和時間值有關。 運行結果: 測試代碼: 於是 就有了 這樣的問題 (如下問題 僅作思考): > 最開始, 項目是 國內項目 —— 從不考慮時區, 統一用的 +8時間, 存入資料庫的 也是 +8時間. > ...
  • 在一些比較重要的業務系統中,通常會要求系統跟蹤數據記錄的變動情況。系統要記錄什麼時間,什麼人,對那些信息進行了變動。 比較簡單的實現方式是在每個表中加入兩個欄位CreatedBy和CreatedAt,見圖1。CreatedBy用來存是誰進行了這次更改。CreatedAt用來存什麼時間進行了這次更改。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...