Commit ee7839ef by haojie

1

parent 8b479c80
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Service\TransactionLogService;
use Illuminate\Http\Request;
class TradeLogController extends Controller
{
public function getLog(Request $request)
{
$status = $request->input('status', '');
$page = $request->input('page', 1);
$limit = $request->input('limit', 10);
if ($limit > 50) {
$limit = 10;
}
$result = app(TransactionLogService::class)->getLog($page, $limit, $status);
return $this->success('success', $result);
}
}
...@@ -20,6 +20,7 @@ class InscriptionTrading extends Model ...@@ -20,6 +20,7 @@ class InscriptionTrading extends Model
'buy_fee', 'buy_fee',
'buy_fee_amount', 'buy_fee_amount',
'status', 'status',
'sell_admin_account',
'seller_status', 'seller_status',
'buyer_status', 'buyer_status',
'seller_transfer_inscription_hash', 'seller_transfer_inscription_hash',
...@@ -40,4 +41,10 @@ public function inscriptions() ...@@ -40,4 +41,10 @@ public function inscriptions()
{ {
return $this->hasOne(Inscriptions::class, 'order_id', 'id'); return $this->hasOne(Inscriptions::class, 'order_id', 'id');
} }
// 日志一对多
public function transactionLog()
{
return $this->hasMany(TransactionLog::class, 'order_id', 'id');
}
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class TransactionLog extends Model class TransactionLog extends Model
{ {
...@@ -28,4 +29,9 @@ class TransactionLog extends Model ...@@ -28,4 +29,9 @@ class TransactionLog extends Model
protected $casts = [ protected $casts = [
'error_message' => 'array', 'error_message' => 'array',
]; ];
public function inscriptionTrading(): BelongsTo
{
return $this->belongsTo(InscriptionTrading::class, 'order_id', 'id');
}
} }
...@@ -77,12 +77,13 @@ class TradeService ...@@ -77,12 +77,13 @@ class TradeService
public function model() public function model()
{ {
return new InscriptionTrading(); return InscriptionTrading::query();
} }
// 创建铭文交易 // 创建铭文交易
public function create($data) public function create($data)
{ {
Log::info($data);
return $this->model()->create($data); return $this->model()->create($data);
} }
...@@ -181,15 +182,13 @@ public function userShelves($payment_address, $hash, $inscription, $price) ...@@ -181,15 +182,13 @@ public function userShelves($payment_address, $hash, $inscription, $price)
$data = [ $data = [
'inscription' => $inscription, 'inscription' => $inscription,
'original_amount' => $price, 'original_amount' => $price,
// 卖家卖出时的收款账号 'sell_admin_account' => $admin_address ?? '',
'sell_admin_account' => $admin_address,
'sell_fee' => $sell_fee, 'sell_fee' => $sell_fee,
'sell_real_amount' => $sell_real_amount, 'sell_real_amount' => $sell_real_amount,
'status' => self::ORDER_STATUS_WAIT, 'status' => self::ORDER_STATUS_WAIT,
'seller_status' => self::SELLER_STATUS_PROGRESS, 'seller_status' => self::SELLER_STATUS_PROGRESS,
'buyer_status' => self::BUYER_STATUS_WAIT, 'buyer_status' => self::BUYER_STATUS_WAIT,
'seller_transfer_inscription_hash' => $hash, 'seller_transfer_inscription_hash' => $hash,
// 卖家地址
'seller_address' => $payment_address, 'seller_address' => $payment_address,
]; ];
$result = $this->create($data); $result = $this->create($data);
......
...@@ -68,4 +68,25 @@ public function update($data) ...@@ -68,4 +68,25 @@ public function update($data)
$log->update($update); $log->update($update);
} }
} }
// 查询日志
public function getLog($page, $limit, $status)
{
$field = ['*'];
$model = TransactionLog::with(['inscriptionTrading']);
if ($status == TradeService::ORDER_STATUS_ON) {
// 上架--卖家转移铭文类型-和转移成功的
$model->where('title', TradeService::TRADE_NAME_SELLER_INSCRIPTION)
->where('status', TradeService::TRADE_STATUS_SUCCESS);
} elseif ($status == TradeService::ORDER_STATUS_SUCCESS) {
// 已完成--订单交易完成的
$model->where('title', TradeService::TRADE_NAME_BUYER_PAY)
->where('status', TradeService::TRADE_STATUS_SUCCESS);
} else {
// 全部-上架,买
$model->whereIn('title', [TradeService::TRADE_NAME_SELLER_INSCRIPTION, TradeService::TRADE_NAME_BUYER_PAY])
->where('status', TradeService::TRADE_STATUS_SUCCESS);
}
return $model->paginate($limit, $field, 'page', $page);
}
} }
...@@ -20,7 +20,7 @@ public function up() ...@@ -20,7 +20,7 @@ public function up()
// 原始金额--卖家输入的 // 原始金额--卖家输入的
$table->decimal('original_amount', 20, 8)->comment('原始金额'); $table->decimal('original_amount', 20, 8)->comment('原始金额');
// 卖家卖出时,平台的收款地址 // 卖家卖出时,平台的收款地址
$table->string('sell_admin_account')->comment('卖家卖出时的收款地址'); $table->string('sell_admin_account')->nullable()->comment('卖家卖出时的收款地址');
// 买家买入时的收款地址 // 买家买入时的收款地址
$table->string('buy_admin_account')->nullable()->comment('买家买入时的收款地址'); $table->string('buy_admin_account')->nullable()->comment('买家买入时的收款地址');
// 卖出手续费比例 // 卖出手续费比例
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
import { computed, inject, ref, watch } from "vue"; import { computed, inject, ref, watch } from "vue";
import CustomCard from "@/components/card.vue"; import CustomCard from "@/components/card.vue";
import CustomInput from "@/components/input/index.vue"; import CustomInput from "@/components/input/index.vue";
import { showMessage } from "@/utils/tool"; import { showMessage, isDev } from "@/utils/tool";
import { inertia_data } from "@/constants/token"; import { inertia_data } from "@/constants/token";
import { inscriptionTransfer } from "@/utils/ethers"; import { inscriptionTransfer } from "@/utils/ethers";
import { useStore } from "vuex"; import { useStore } from "vuex";
...@@ -183,15 +183,28 @@ const onSubmit = async () => { ...@@ -183,15 +183,28 @@ const onSubmit = async () => {
let current_price = price.value; let current_price = price.value;
// 本次铭文信息 // 本次铭文信息
let current_inscription = props.info; let current_inscription = props.info;
// 可以转移 if (isDev()) {
const res = await inscriptionTransfer(receipt_account, from, data); let res = {
if (res && res.hash) { from: "0x53d05d2f8BDbB5ce389D313CD6d320fb0Fb1C397",
hash: "0x32360056d88b1bc44eaa6da76a8334c868ec8891ac00abe99f5116468a3bb377",
};
// 本地直接提交
let status = await submitAdmin(res, current_price, current_inscription); let status = await submitAdmin(res, current_price, current_inscription);
if (status) { } else {
// 关闭弹窗 // 可以转移
visible.value = false; const res = await inscriptionTransfer(receipt_account, from, data);
// 通知页面更新我的铭文列表 if (res && res.hash) {
emit("updateList"); let status = await submitAdmin(
res,
current_price,
current_inscription
);
if (status) {
// 关闭弹窗
visible.value = false;
// 通知页面更新我的铭文列表
emit("updateList");
}
} }
} }
}; };
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
<template #footer> <template #footer>
<div class="buy-dialog-footer"> <div class="buy-dialog-footer">
<!-- --> <!-- -->
<!-- <t-button @click="testSubmit">测试按钮</t-button> -->
<t-button class="buy-cancel-button" @click="visible = false" <t-button class="buy-cancel-button" @click="visible = false"
>取消</t-button >取消</t-button
> >
...@@ -92,13 +93,13 @@ const submitAdmin = async ( ...@@ -92,13 +93,13 @@ const submitAdmin = async (
console.log(e); console.log(e);
} }
}; };
// const testSubmit = () => { const testSubmit = () => {
// submitAdmin( // submitAdmin(
// "0x762acfc0e06bd403ba4acf772b799b4f9b514fb7d89c161ce23ba0307e562a2c", // "0x762acfc0e06bd403ba4acf772b799b4f9b514fb7d89c161ce23ba0307e562a2c",
// "0x51eF357cf7204DB2a6e31750817F709a10c86f37", // "0x51eF357cf7204DB2a6e31750817F709a10c86f37",
// "1" // "1"
// ); // );
// }; };
// 立即购买 // 立即购买
const onSubmit = async () => { const onSubmit = async () => {
......
<template> <template>
<div class="">2</div> <div class="tabs-panel-trade-log">
<div class="chose-btns">
<CustomGroupButton
:list="groupBtns"
v-model="currentBtn"
parentHeight="36px"
childHeight="26px"
:bordered="false"
></CustomGroupButton>
</div>
<div class="trade-log-table-box">
<CustomTable
:data="tableList"
:columns="columns"
:loading="loading"
className="trade-log-table"
></CustomTable>
<div class="pagination-box">
<CustomPagination
:total="total"
:pageNum="pageNum"
:pageSize="pageSize"
align="right"
@pageChange="pageChange"
></CustomPagination>
</div>
</div>
</div>
</template> </template>
<script lang="ts" setup></script> <script lang="tsx" setup>
import CustomGroupButton from "@/components/groupButton.vue";
import { ref, onMounted } from "vue";
import CustomPagination from "@/components/pagination.vue";
import CustomTable from "@/components/table.vue";
import { getTradeLog } from "@/utils/api";
<style lang="less"></style> // 页面展示的列表
const tableList = ref([]);
const loading = ref(false);
const pageNum = ref(1);
const pageSize = ref(10);
const total = ref(0);
const currentBtn = ref("");
const groupBtns = [
{
label: "所有",
value: "",
},
{
label: "进行中",
value: "2",
},
{
label: "已完成",
value: "3",
},
];
const columns = [
{
colKey: "Protocol",
title: "协议",
align: "center",
className: "font700 font16",
width: "10%",
},
{
colKey: "Name",
title: "名称",
align: "center",
className: "font700 font16",
width: "10%",
},
{
colKey: "DeployTime",
title: "部署时间",
align: "center",
className: () => "font14",
},
{
colKey: "TotalSupply",
title: "总供应量",
align: "center",
className: "public-style font14",
},
{
colKey: "LimitPerMint",
title: "每个铭文数量",
align: "center",
className: "public-style font14",
},
{
colKey: "ValidMinted",
title: "有效铸造",
align: "center",
className: "public-style font14",
},
{
colKey: "Holders",
title: "持有者",
align: "center",
className: "public-style font14",
},
{
colKey: "Progress",
title: "状态",
align: "center",
cell: (h, { col, row }) => (
<div class="custom-progress">
<span class="label">{row[col.colKey]}%</span>
<CustomProgress
num={parseFloat(row[col.colKey] + "")}
label={false}
width="100%"
strokeWidth="8px"
></CustomProgress>
</div>
),
},
{
colKey: "TotalMinted",
title: "总铸造",
align: "center",
className: "public-style font14",
},
{
colKey: "Minters",
title: "铸造者",
align: "center",
className: "public-style font14",
},
{
colKey: "Transactions",
title: "交易笔数",
align: "center",
className: "public-style font14",
},
];
const getList = async () => {
try {
let params: any = {
status: currentBtn.value,
page: pageNum.value,
limit: pageSize.value,
};
loading.value = true;
const res: any = await getTradeLog(params);
if (res.code == 0) {
res.data.data.forEach((item: any) => {});
tableList.value = res.data.data;
total.value = res.data.total;
}
loading.value = false;
} catch (e) {
console.log(e);
loading.value = false;
}
};
const pageChange = (value: number) => {
pageNum.value = value;
getList();
};
onMounted(() => {
getList();
});
</script>
<style lang="less">
.tabs-panel-trade-log {
.chose-btns {
margin: 20px 0;
text-align: right;
}
}
</style>
<template> <template>
<t-pagination <t-pagination
class="custom-default-pagination"
:class="{
'pagination-align-center': align === 'center',
}"
v-model="cpageNum" v-model="cpageNum"
v-model:pageSize="cpageSize" v-model:pageSize="cpageSize"
:total="total" :total="total"
show-sizer show-sizer
@currentChange="onCurrentChange" @currentChange="onCurrentChange"
:pageSizeOptions="pageSizeOptions" :pageSizeOptions="pageSizeOptions"
/> >
<template #totalContent>
<span v-if="showTotal">{{ total }}条数据</span>
</template>
</t-pagination>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
...@@ -19,9 +27,13 @@ const props = withDefaults( ...@@ -19,9 +27,13 @@ const props = withDefaults(
pageSize: number; pageSize: number;
total: number; total: number;
pageSizeOptions?: any[]; pageSizeOptions?: any[];
align?: string;
showTotal?: boolean;
}>(), }>(),
{ {
pageSizeOptions: [], pageSizeOptions: [],
align: "center",
showTotal: false,
} }
); );
const emit = defineEmits(["pageChange"]); const emit = defineEmits(["pageChange"]);
...@@ -43,4 +55,23 @@ watch( ...@@ -43,4 +55,23 @@ watch(
); );
</script> </script>
<style lang="less"></style> <style lang="less">
.custom-default-pagination {
.t-pagination__number {
color: #474d57;
border-color: transparent;
&:active {
background: transparent;
}
}
.t-pagination__number.t-is-current {
background: #eaecef;
border-color: #eaecef;
border-radius: 4px;
color: #1e2329;
}
}
.pagination-align-center {
justify-content: center;
}
</style>
...@@ -45,3 +45,10 @@ export const getOutSiteMarketInscription = (data: any) => { ...@@ -45,3 +45,10 @@ export const getOutSiteMarketInscription = (data: any) => {
params: data, params: data,
}); });
}; };
// 获取交易日志
export const getTradeLog = (data: any) => {
return request.get("/api/inscription/log", {
params: data,
});
};
...@@ -42,8 +42,10 @@ ...@@ -42,8 +42,10 @@
Route::post('/buy', 'TradeController@buy'); Route::post('/buy', 'TradeController@buy');
// 本地转账登录 // 本地转账登录
Route::post('/transfer/login', 'AuthController@login'); Route::post('/transfer/login', 'AuthController@login');
// 交易日志
Route::get('/log', 'TradeLogController@getLog');
}); });
// 本地话接口--需要登录 // 本地话接口--需要登录
Route::group([ Route::group([
'middleware' => 'auth:api', 'middleware' => 'auth:api',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment