feat: the shop can create a order into DB
This commit is contained in:
parent
26bc81aa56
commit
3047758550
@ -107,6 +107,23 @@ def shop_check():
|
|||||||
else:
|
else:
|
||||||
return jsonify({'status': False})
|
return jsonify({'status': False})
|
||||||
|
|
||||||
|
@app.route('/shop/<address>/products', methods=['GET'])
|
||||||
|
def shop_products(address):
|
||||||
|
db = sqlite3.connect(DATABASE)
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute("SELECT `products`.`id`, `products`.`name`, `products`.`price`, `products`.`code` FROM `shops`, `products` \
|
||||||
|
WHERE `shops`.id = `products`.`shop_id`and `shops`.`address`=?", (address, ))
|
||||||
|
result = cursor.fetchall()
|
||||||
|
|
||||||
|
ans = {'products': {}}
|
||||||
|
for product in result:
|
||||||
|
ans['products'][str(product[3])] = {
|
||||||
|
'id': product[0],
|
||||||
|
'name': product[1],
|
||||||
|
'price': str(product[2]),
|
||||||
|
}
|
||||||
|
return jsonify(ans)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
initDB()
|
initDB()
|
||||||
app.run(host="0.0.0.0")
|
app.run(host="0.0.0.0")
|
||||||
|
|||||||
@ -22,29 +22,57 @@ export default {
|
|||||||
web3: null,
|
web3: null,
|
||||||
token: null,
|
token: null,
|
||||||
bank: null,
|
bank: null,
|
||||||
picName: '',
|
warningModalStatus: false,
|
||||||
pic: '',
|
successModalStatus: false,
|
||||||
credit: '',
|
msg: '',
|
||||||
arrear: '',
|
isWaiting: false,
|
||||||
|
products: {},
|
||||||
|
productCar: [],
|
||||||
|
orderId: '0'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
// if (!this.$cookies.isKey('linked')) {
|
|
||||||
// this.$router.push('/')
|
|
||||||
// }
|
|
||||||
this.web3 = new Web3(window.ethereum)
|
this.web3 = new Web3(window.ethereum)
|
||||||
this.clientAddr = this.$cookies.get('address')
|
if (this.$cookies.isKey('address')) {
|
||||||
|
this.clientAddr = this.$cookies.get('address')
|
||||||
|
} else {
|
||||||
|
console.log("Use default address")
|
||||||
|
this.clientAddr = import.meta.env.VITE_DEFAULT_SHOP
|
||||||
|
}
|
||||||
this.web3.eth.defaultAccount = this.clientAddr
|
this.web3.eth.defaultAccount = this.clientAddr
|
||||||
this.token = new this.web3.eth.Contract(SBT, this.SBTAddress)
|
this.token = new this.web3.eth.Contract(SBT, this.SBTAddress)
|
||||||
this.bank = new this.web3.eth.Contract(Bank, this.BankAddress)
|
this.bank = new this.web3.eth.Contract(Bank, this.BankAddress)
|
||||||
|
|
||||||
|
var result = await fetch(import.meta.env.VITE_BACKEND_PREFIX + "/shop/" + this.clientAddr + "/products")
|
||||||
|
var data = await result.json()
|
||||||
|
for (let product in data['products']) {
|
||||||
|
this.products[product] = data['products'][product]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
amount() {
|
||||||
|
if (!this.web3) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var ans = 0
|
||||||
|
for (let product of this.productCar) {
|
||||||
|
ans += Number(product['price']) * product['count']
|
||||||
|
}
|
||||||
|
return this.web3.utils.fromWei(ans.toString())
|
||||||
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onScanSuccess(decodedText, decodedResult) {
|
onScanSuccess(decodedText, decodedResult) {
|
||||||
// handle the scanned code as you like, for example:
|
// handle the scanned code as you like, for example:
|
||||||
console.log(`Code matched = ${decodedText}`, decodedResult);
|
console.log(`Code matched = ${decodedText}`, decodedResult);
|
||||||
var last_id = decodedText.split('/').pop()
|
var product = this.products[decodedText]
|
||||||
|
this.productCar.push({
|
||||||
|
'name': product['name'],
|
||||||
|
'id': product['id'],
|
||||||
|
'price': product['price'],
|
||||||
|
'count': 1
|
||||||
|
})
|
||||||
this.scanner.clear()
|
this.scanner.clear()
|
||||||
this.$router.push('/client/pay/'+last_id)
|
|
||||||
},
|
},
|
||||||
scan() {
|
scan() {
|
||||||
this.scanner = new Html5QrcodeScanner(
|
this.scanner = new Html5QrcodeScanner(
|
||||||
@ -52,6 +80,36 @@ export default {
|
|||||||
{ fps: 10, qrbox: { width: 250, height: 250 } },
|
{ fps: 10, qrbox: { width: 250, height: 250 } },
|
||||||
/* verbose= */ false);
|
/* verbose= */ false);
|
||||||
this.scanner.render(this.onScanSuccess);
|
this.scanner.render(this.onScanSuccess);
|
||||||
|
},
|
||||||
|
async send() {
|
||||||
|
this.isWaiting = true
|
||||||
|
|
||||||
|
var data = {}
|
||||||
|
data['from'] = this.clientAddr
|
||||||
|
data['products'] = []
|
||||||
|
for (let product of this.productCar) {
|
||||||
|
data['products'].push({
|
||||||
|
'product_id': product['id'],
|
||||||
|
'count': product['count']
|
||||||
|
})
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
var result = await fetch(import.meta.env.VITE_BACKEND_PREFIX+"/order", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
})
|
||||||
|
this.orderId = await result.json()
|
||||||
|
this.msg = '完成'
|
||||||
|
this.successModalStatus = true
|
||||||
|
} catch (error) {
|
||||||
|
this.msg = '錯誤'
|
||||||
|
this.warningModalStatus = true
|
||||||
|
}
|
||||||
|
this.productCar = []
|
||||||
|
this.isWaiting = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -71,18 +129,43 @@ export default {
|
|||||||
<PageTitle title="店家收款" subtitle="掃描商品條碼以加入收款單"></PageTitle>
|
<PageTitle title="店家收款" subtitle="掃描商品條碼以加入收款單"></PageTitle>
|
||||||
</div>
|
</div>
|
||||||
<div class="block">
|
<div class="block">
|
||||||
|
<button class="button is-success is-outlined is-large" @click="scan">掃描商品條碼</button>
|
||||||
</div>
|
|
||||||
<div class="block">
|
|
||||||
<button class="button is-success is-outlined is-large" @click="scan">Pay</button>
|
|
||||||
<div id="reader" width="300px"></div>
|
<div id="reader" width="300px"></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="block">
|
||||||
|
<table class="table is-fullwidth">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th colspan="4" style="text-align: center;">商品清單</th>
|
||||||
|
</tr>
|
||||||
|
<template v-for="product in productCar">
|
||||||
|
<tr>
|
||||||
|
<td>{{ product['name'] }}</td>
|
||||||
|
<td>{{ this.web3.utils.fromWei(product['price']) }} ETH</td>
|
||||||
|
<td><input class="input is-info" type="number" v-model="product['count']">個</td>
|
||||||
|
</tr>
|
||||||
|
</template>
|
||||||
|
<tr>
|
||||||
|
<td colspan="3">共計 {{ amount }} ETH</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="block">
|
||||||
|
<template v-if="!isWaiting">
|
||||||
|
<button class="button is-info is-outlined is-large" @click="send">確認以上訂單</button>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<button class="button is-info is-outlined is-large is-loading"></button>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<WarningModal :active="warningModalStatus" :errorMsg="msg" @closeModal="warningModalStatus = false"></WarningModal>
|
<WarningModal :active="warningModalStatus" :errorMsg="msg" @closeModal="warningModalStatus = false"></WarningModal>
|
||||||
<SuccessModal :active="successModalStatus" :successMsg="msg" @closeModal="successModalStatus = false"
|
<SuccessModal :active="successModalStatus" :successMsg="msg" @closeModal="successModalStatus = false"
|
||||||
link="/signup/linksbt" btnName="繼續"></SuccessModal>
|
:link="`/shop/pay/${this.orderId}`" btnName="繼續"></SuccessModal>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user