修复管理员添加

增加充值订单退款  退款记录  余额明细  退款记录
增加支付设置
增加注册设置
This commit is contained in:
echobool
2023-11-17 00:53:53 +08:00
parent 0f17630aa2
commit e5c4340a09
115 changed files with 7128 additions and 1198 deletions

View File

@@ -0,0 +1,10 @@
import request from '@/utils/request'
export function getRechargeConfig() {
return request.get({ url: '/setting/recharge/get' })
}
// 设置
export function setRechargeConfig(params: any) {
return request.post({ url: '/setting/recharge/set', params })
}

View File

@@ -0,0 +1,11 @@
import request from '@/utils/request'
// 微信开发平台配置保存
export function setOpenSettingConfig(params: any) {
return request.post({ url: '/channel.open_setting/setConfig', params })
}
// 微信开发平台配置详情
export function getOpenSettingConfig() {
return request.get({ url: '/channel.open_setting/getConfig' })
}

41
admin/src/api/finance.ts Normal file
View File

@@ -0,0 +1,41 @@
import request from '@/utils/request'
// 余额明细
export function accountLog(params?: any) {
return request.get({ url: '/finance/account_log/lists', params })
}
// 充值记录
export function rechargeLists(params?: any) {
return request.get({ url: '/finance/recharge/lists', params }, { ignoreCancelToken: true })
}
// 余额变动类型
export function getUmChangeType(params?: any) {
return request.get({ url: '/finance/account_log/getUmChangeType', params })
}
//退款
export function refund(params?: any) {
return request.post({ url: '/finance/recharge/refund', params })
}
//重新退款
export function refundAgain(params?: any) {
return request.post({ url: '/finance/recharge/refundAgain', params })
}
//退款记录
export function refundRecord(params?: any) {
return request.get({ url: '/finance/refund/record/list', params })
}
//退款日志
export function refundLog(params?: any) {
return request.get({ url: '/finance/refund/log', params })
}
//退款统计
export function refundStat(params?: any) {
return request.get({ url: '/finance/refund/record/stat', params })
}

View File

@@ -0,0 +1,26 @@
import request from '@/utils/request'
// 获取支付方式
export function getPayWay() {
return request.get({ url: '/setting/pay/way/get' })
}
// 设置支付方式
export function setPayWay(params: any) {
return request.post({ url: '/setting/pay/way/set', params })
}
// 获取支付方式
export function getPayConfigLists() {
return request.get({ url: '/setting/pay/config/lists' })
}
// 设置支付方式
export function setPayConfig(params: any) {
return request.post({ url: '/setting/pay/config/set', params })
}
// 设置支付方式
export function getPayConfig(params: any) {
return request.get({ url: '/setting/pay/config/get', params })
}

View File

@@ -13,7 +13,7 @@ export function getUserSetup() {
* @param { string } defaultAvatar 默认用户头像
* @description 设置用户设置
*/
export function setUserSetup(params: { defaultAvatar: string }) {
export function setUserSetup(params: { default_avatar: string }) {
return request.post({ url: '/setting/user/save', params })
}

View File

@@ -28,14 +28,14 @@ export function useCate(type: number) {
type
})
const item: any[] = [
// {
// name: '全部',
// id: ''
// },
// {
// name: '未分组',
// id: 0
// }
{
name: '全部',
id: ''
},
{
name: '未分组',
id: 0
}
]
cateLists.value = data
cateLists.value.unshift(...item)

View File

@@ -4,56 +4,31 @@
<div class="flex-1 min-h-0">
<el-scrollbar>
<div class="material-left__content pt-4 p-b-4">
<el-tree
ref="treeRef"
node-key="id"
:data="cateLists"
empty-text=""
:highlight-current="true"
:expand-on-click-node="false"
:current-node-key="cateId"
@node-click="handleCatSelect"
>
<el-tree ref="treeRef" node-key="id" :data="cateLists" empty-text="" :highlight-current="true"
:expand-on-click-node="false" :current-node-key="cateId" @node-click="handleCatSelect">
<template v-slot="{ data }">
<div class="flex flex-1 items-center min-w-0 pr-4">
<img
class="w-[20px] h-[16px] mr-3"
src="@/assets/images/icon_folder.png"
/>
<img class="w-[20px] h-[16px] mr-3" src="@/assets/images/icon_folder.png" />
<span class="flex-1 truncate mr-2">
<overflow-tooltip :content="data.name" />
</span>
<el-dropdown
v-perms="[
'common:album:cateRename',
'common:album:cateDel'
]"
v-if="data.id > 0"
:hide-on-click="false"
>
<el-dropdown v-perms="[
'common:album:cateRename',
'common:album:cateDel'
]" v-if="data.id > 0" :hide-on-click="false">
<span class="muted m-r-10">···</span>
<template #dropdown>
<el-dropdown-menu>
<popover-input
v-perms="['common:album:cateRename']"
@confirm="handleEditCate($event, data.id)"
size="default"
:value="data.name"
width="400px"
:limit="20"
show-limit
teleported
>
<popover-input v-perms="['common:album:cateRename']"
@confirm="handleEditCate($event, data.id)" size="default"
:value="data.name" width="400px" :limit="20" show-limit teleported>
<div>
<el-dropdown-item>
命名分组
</el-dropdown-item>
</div>
</popover-input>
<div
v-perms="['common:album:cateDel']"
@click="handleDeleteCate(data.id)"
>
<div v-perms="['common:album:cateDel']" @click="handleDeleteCate(data.id)">
<el-dropdown-item>删除分组</el-dropdown-item>
</div>
</el-dropdown-menu>
@@ -67,15 +42,8 @@
</div>
<div class="flex justify-center p-2 border-t border-br">
<popover-input
v-perms="['common:album:cateAdd']"
@confirm="handleAddCate"
size="default"
width="400px"
:limit="20"
show-limit
teleported
>
<popover-input v-perms="['common:album:cateAdd']" @confirm="handleAddCate" size="default" width="400px"
:limit="20" show-limit teleported>
<el-button> 添加分组 </el-button>
</popover-input>
</div>
@@ -83,45 +51,21 @@
<div class="material__center flex flex-col">
<div class="operate-btn flex">
<div class="flex-1 flex">
<upload
v-if="type == 'image'"
v-perms="['common:upload:image']"
class="mr-3"
:data="{ cid: cateId }"
:type="type"
:show-progress="true"
@change="refresh"
>
<upload v-if="type == 'image'" v-perms="['common:upload:image']" class="mr-3" :data="{ cid: cateId }"
:type="type" :show-progress="true" @change="refresh">
<el-button type="primary">本地上传</el-button>
</upload>
<upload
v-if="type == 'video'"
v-perms="['common:upload:video']"
class="mr-3"
:data="{ cid: cateId }"
:type="type"
:show-progress="true"
@change="refresh"
>
<upload v-if="type == 'video'" v-perms="['common:upload:video']" class="mr-3" :data="{ cid: cateId }"
:type="type" :show-progress="true" @change="refresh">
<el-button type="primary">本地上传</el-button>
</upload>
<el-button
v-perms="['common:album:albumDel']"
v-if="mode == 'page'"
:disabled="!select.length"
@click.stop="batchFileDelete()"
>
<el-button v-perms="['common:album:albumDel']" v-if="mode == 'page'" :disabled="!select.length"
@click.stop="batchFileDelete()">
删除
</el-button>
<popup
v-perms="['common:album:albumMove']"
v-if="mode == 'page'"
class="ml-3"
@confirm="batchFileMove"
:disabled="!select.length"
title="移动文件"
>
<popup v-perms="['common:album:albumMove']" v-if="mode == 'page'" class="ml-3" @confirm="batchFileMove"
:disabled="!select.length" title="移动文件">
<template #trigger>
<el-button :disabled="!select.length">移动</el-button>
</template>
@@ -130,22 +74,13 @@
<span class="mr-5">移动文件至</span>
<el-select v-model="moveId" placeholder="请选择">
<template v-for="item in cateLists" :key="item.id">
<el-option
v-if="item.id !== ''"
:label="item.name"
:value="item.id"
></el-option>
<el-option v-if="item.id !== ''" :label="item.name" :value="item.id"></el-option>
</template>
</el-select>
</div>
</popup>
</div>
<el-input
class="w-60"
placeholder="请输入名称"
v-model="fileParams.name"
@keyup.enter="refresh"
>
<el-input class="w-80" placeholder="请输入名称" v-model="fileParams.name" @keyup.enter="refresh">
<template #append>
<el-button @click="refresh">
<template #icon>
@@ -156,55 +91,33 @@
</el-input>
<div class="flex items-center ml-2">
<el-tooltip content="列表视图" placement="top">
<div
class="list-icon"
:class="{
select: listShowType == 'table'
}"
@click="listShowType = 'table'"
>
<div class="list-icon" :class="{
select: listShowType == 'table'
}" @click="listShowType = 'table'">
<icon name="local-icon-list-2" :size="18" />
</div>
</el-tooltip>
<el-tooltip content="平铺视图" placement="top">
<div
class="list-icon"
:class="{
select: listShowType == 'normal'
}"
@click="listShowType = 'normal'"
>
<div class="list-icon" :class="{
select: listShowType == 'normal'
}" @click="listShowType = 'normal'">
<icon name="el-icon-Menu" :size="18" />
</div>
</el-tooltip>
</div>
</div>
<div class="mt-3" v-if="mode == 'page'">
<el-checkbox
:disabled="!pager.lists.length"
v-model="isCheckAll"
@change="selectAll"
:indeterminate="isIndeterminate"
>
<el-checkbox :disabled="!pager.lists.length" v-model="isCheckAll" @change="selectAll"
:indeterminate="isIndeterminate">
当页全选
</el-checkbox>
</div>
<div class="material-center__content flex flex-col flex-1 mb-1 min-h-0">
<el-scrollbar v-if="pager.lists.length" v-show="listShowType == 'normal'">
<ul class="file-list flex flex-wrap mt-4">
<li
class="file-item-wrap"
v-for="item in pager.lists"
:key="item.id"
:style="{ width: fileSize }"
>
<li class="file-item-wrap" v-for="item in pager.lists" :key="item.id" :style="{ width: fileSize }">
<del-wrap @close="batchFileDelete([item.id])">
<file-item
:uri="item.uri"
:file-size="fileSize"
:type="type"
@click="selectFile(item)"
>
<file-item :uri="item.uri" :file-size="fileSize" :type="type" @click="selectFile(item)">
<div class="item-selected" v-if="isSelect(item.id)">
<icon :size="24" name="el-icon-Check" color="#fff" />
</div>
@@ -213,16 +126,9 @@
<overflow-tooltip class="mt-1" :content="item.name" />
<div class="operation-btns flex items-center">
<popover-input
v-perms="['common:album:albumRename']"
@confirm="handleFileRename($event, item.id)"
size="default"
:value="item.name"
width="400px"
:limit="50"
show-limit
teleported
>
<popover-input v-perms="['common:album:albumRename']"
@confirm="handleFileRename($event, item.id)" size="default" :value="item.name"
width="400px" :limit="50" show-limit teleported>
<el-button type="primary" link> 重命名 </el-button>
</popover-input>
<el-button type="primary" link @click="handlePreview(item.uri)">
@@ -233,16 +139,8 @@
</ul>
</el-scrollbar>
<el-table
ref="tableRef"
class="mt-4"
v-show="listShowType == 'table'"
:data="pager.lists"
width="100%"
height="100%"
size="large"
@row-click="selectFile"
>
<el-table ref="tableRef" class="mt-4" v-show="listShowType == 'table'" :data="pager.lists" width="100%"
height="100%" size="large" @row-click="selectFile">
<el-table-column width="55">
<template #default="{ row }">
<el-checkbox :modelValue="isSelect(row.id)" @change="selectFile(row)" />
@@ -264,15 +162,8 @@
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<div class="inline-block" v-perms="['common:album:albumRename']">
<popover-input
@confirm="handleFileRename($event, row.id)"
size="default"
:value="row.name"
width="400px"
:limit="50"
show-limit
teleported
>
<popover-input @confirm="handleFileRename($event, row.id)" size="default" :value="row.name"
width="400px" :limit="50" show-limit teleported>
<el-button type="primary" link> 重命名 </el-button>
</popover-input>
</div>
@@ -282,11 +173,7 @@
</el-button>
</div>
<div class="inline-block" v-perms="['common:album:albumDel']">
<el-button
type="primary"
link
@click.stop="batchFileDelete([row.id])"
>
<el-button type="primary" link @click.stop="batchFileDelete([row.id])">
删除
</el-button>
</div>
@@ -294,10 +181,7 @@
</el-table-column>
</el-table>
<div
class="flex flex-1 justify-center items-center"
v-if="!pager.loading && !pager.lists.length"
>
<div class="flex flex-1 justify-center items-center" v-if="!pager.loading && !pager.lists.length">
暂无数据~
</div>
</div>
@@ -305,29 +189,17 @@
<div class="flex">
<template v-if="mode == 'page'">
<span class="mr-3">
<el-checkbox
:disabled="!pager.lists.length"
v-model="isCheckAll"
@change="selectAll"
:indeterminate="isIndeterminate"
>
<el-checkbox :disabled="!pager.lists.length" v-model="isCheckAll" @change="selectAll"
:indeterminate="isIndeterminate">
当页全选
</el-checkbox>
</span>
<el-button
v-perms="['common:album:albumDel']"
:disabled="!select.length"
@click="batchFileDelete()"
>
<el-button v-perms="['common:album:albumDel']" :disabled="!select.length"
@click="batchFileDelete()">
删除
</el-button>
<popup
v-perms="['common:album:albumMove']"
class="ml-3 inline"
@confirm="batchFileMove"
:disabled="!select.length"
title="移动文件"
>
<popup v-perms="['common:album:albumMove']" class="ml-3 inline" @confirm="batchFileMove"
:disabled="!select.length" title="移动文件">
<template #trigger>
<el-button :disabled="!select.length">移动</el-button>
</template>
@@ -336,22 +208,14 @@
<span class="mr-5">移动文件至</span>
<el-select v-model="moveId" placeholder="请选择">
<template v-for="item in cateLists" :key="item.id">
<el-option
v-if="item.id !== ''"
:label="item.name"
:value="item.id"
></el-option>
<el-option v-if="item.id !== ''" :label="item.name" :value="item.id"></el-option>
</template>
</el-select>
</div>
</popup>
</template>
</div>
<pagination
v-model="pager"
@change="getFileList"
layout="total, prev, pager, next, jumper"
/>
<pagination v-model="pager" @change="getFileList" layout="total, prev, pager, next, jumper" />
</div>
</div>
<div class="material__right" v-if="mode == 'picker'">
@@ -368,11 +232,7 @@
<li class="mb-4" v-for="item in select" :key="item.id">
<div class="select-item">
<del-wrap @close="cancelSelete(item.id)">
<file-item
:uri="item.uri"
file-size="100px"
:type="type"
></file-item>
<file-item :uri="item.uri" file-size="100px" :type="type"></file-item>
</del-wrap>
</div>
</li>
@@ -519,31 +379,38 @@ defineExpose({
<style scoped lang="scss">
.material {
@apply h-full min-h-0 flex flex-1;
&__left {
@apply border-r border-br flex flex-col w-[200px];
:deep(.el-tree-node__content) {
height: 36px;
}
}
&__center {
flex: 1;
min-width: 0;
min-height: 0;
padding: 16px 16px 0;
.list-icon {
border-radius: 3px;
display: flex;
padding: 5px;
cursor: pointer;
&.select {
@apply text-primary bg-primary-light-8;
}
}
.file-list {
.file-item-wrap {
margin-right: 16px;
line-height: 1.3;
cursor: pointer;
.item-selected {
display: flex;
align-items: center;
@@ -557,19 +424,23 @@ defineExpose({
background-color: rgba(0, 0, 0, 0.5);
box-sizing: border-box;
}
.operation-btns {
height: 28px;
visibility: hidden;
}
&:hover .operation-btns {
visibility: visible;
}
}
}
}
&__right {
@apply border-l border-br flex flex-col;
width: 130px;
.select-lists {
padding: 10px;

View File

@@ -1,31 +1,18 @@
<template>
<div class="material-select">
<popup
ref="popupRef"
width="830px"
custom-class="body-padding"
:title="`选择${tipsText}`"
@confirm="handleConfirm"
@close="handleClose"
>
<popup ref="popupRef" width="930px" custom-class="body-padding" :title="`选择${tipsText}`" @confirm="handleConfirm"
@close="handleClose">
<template v-if="!hiddenUpload" #trigger>
<div class="material-select__trigger clearfix" @click.stop>
<draggable class="draggable" v-model="fileList" animation="300" item-key="id">
<template v-slot:item="{ element, index }">
<div
class="material-preview"
:class="{
'is-disabled': disabled,
'is-one': limit == 1
}"
@click="showPopup(index)"
>
<div class="material-preview" :class="{
'is-disabled': disabled,
'is-one': limit == 1
}" @click="showPopup(index)">
<del-wrap @close="deleteImg(index)">
<file-item
:uri="excludeDomain ? getImageUrl(element) : element"
:file-size="size"
:type="type"
></file-item>
<file-item :uri="excludeDomain ? getImageUrl(element) : element" :file-size="size"
:type="type"></file-item>
</del-wrap>
<div class="operation-btns text-xs text-center">
<span>修改</span>
@@ -35,24 +22,16 @@
</div>
</template>
</draggable>
<div
class="material-upload"
@click="showPopup(-1)"
v-show="showUpload"
:class="{
'is-disabled': disabled,
'is-one': limit == 1,
[uploadClass]: true
}"
>
<div class="material-upload" @click="showPopup(-1)" v-show="showUpload" :class="{
'is-disabled': disabled,
'is-one': limit == 1,
[uploadClass]: true
}">
<slot name="upload">
<div
class="upload-btn"
:style="{
width: size,
height: size
}"
>
<div class="upload-btn" :style="{
width: size,
height: size
}">
<icon :size="25" name="el-icon-Plus" />
<span>添加</span>
</div>
@@ -62,13 +41,8 @@
</template>
<el-scrollbar>
<div class="material-wrap">
<material
ref="materialRef"
:type="type"
:file-size="fileSize"
:limit="meterialLimit"
@change="selectChange"
/>
<material ref="materialRef" :type="type" :file-size="fileSize" :limit="meterialLimit"
@change="selectChange" />
</div>
</el-scrollbar>
</popup>
@@ -112,6 +86,11 @@ export default defineComponent({
type: String,
default: '100px'
},
// 文件尺寸
filePath: {
type: String,
default: ''
},
// 选择数量限制
limit: {
type: Number,
@@ -199,6 +178,7 @@ export default defineComponent({
const selectChange = (val: any[]) => {
select.value = val
}
const handleChange = () => {
const valueImg = limit.value != 1 ? fileList.value : fileList.value[0] || ''
@@ -258,6 +238,7 @@ export default defineComponent({
<style scoped lang="scss">
.material-select {
.material-upload,
.material-preview {
position: relative;
@@ -267,17 +248,21 @@ export default defineComponent({
margin-bottom: 8px;
box-sizing: border-box;
float: left;
&.is-disabled {
cursor: not-allowed;
}
&.is-one {
margin-bottom: 0;
}
&:hover {
.operation-btns {
display: block;
}
}
.operation-btns {
display: none;
position: absolute;
@@ -289,12 +274,14 @@ export default defineComponent({
background-color: rgba(0, 0, 0, 0.3);
}
}
.material-upload {
:deep(.upload-btn) {
@apply text-tx-secondary box-border rounded border-br border-dashed border flex flex-col justify-center items-center;
}
}
}
.material-wrap {
min-width: 720px;
height: 430px;

View File

@@ -19,7 +19,8 @@ export function usePaging(options: Options) {
size,
loading: firstLoading,
count: 0,
lists: [] as any[]
lists: [] as any[],
extend: {} as Record<string, any>
})
// 请求分页接口
const getLists = () => {

View File

@@ -87,6 +87,8 @@ export function findFirstValidRoute(routes: RouteRecordRaw[]): string | undefine
//通过权限字符查询路由路径
export function getRoutePath(perms: string) {
const routerObj = useRouter() || router
console.log(routerObj);
return routerObj.getRoutes().find((item) => item.meta?.perms == perms)?.path || ''
}

View File

@@ -0,0 +1,49 @@
<template>
<div>
<el-card shadow="never" class="!border-none">
<template #header>
<span class="font-extrabold text-lg">充值设置</span>
</template>
<el-form :model="formData" label-width="120px">
<el-form-item label="状态">
<div>
<el-radio-group v-model="formData.status" class="ml-4">
<el-radio :label="1">开启</el-radio>
<el-radio :label="0">关闭</el-radio>
</el-radio-group>
<div class="form-tips">关闭或开启充值功能关闭后将不显示充值入口</div>
</div>
</el-form-item>
<el-form-item label="最低充值金额">
<div>
<el-input v-model.number="formData.min_amount" type="number" min="1" placeholder="请输入最低充值金额"
clearable />
<div class="form-tips">
最低充值金额要求不填或填0表示不限制最低充值金额
</div>
</div>
</el-form-item>
</el-form>
</el-card>
<footer-btns v-perms="['setting:recharge:set']">
<el-button type="primary" @click="handleSubmit">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup>
import { getRechargeConfig, setRechargeConfig } from '@/api/app/recharge'
const formData = reactive({
status: 1, //功能状态 1-开启 0-关闭
min_amount: 1 //最低充值金额
})
const getConfig = async () => {
const data = await getRechargeConfig()
Object.assign(formData, data)
}
const handleSubmit = async () => {
await setRechargeConfig(formData)
getConfig()
}
getConfig()
</script>

View File

@@ -1,10 +1,10 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert type="warning" title="温馨提示H5商城设置" :closable="false" show-icon />
<el-alert type="warning" title="温馨提示H5设置" :closable="false" show-icon />
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-form ref="formRef" :model="formData" label-width="120px">
<el-form-item label="渠道状态" required prop="status">
<div>
<el-radio-group v-model="formData.status">
@@ -14,33 +14,38 @@
<div class="form-tips">状态为关闭时将不对外提供服务请谨慎操作</div>
</div>
</el-form-item>
<el-form-item label="关闭后访问页面" prop="close">
<el-radio-group v-model="formData.close">
<el-form-item label="关闭后访问页面" prop="page_status">
<el-radio-group v-model="formData.page_status">
<el-radio :label="0">空页面</el-radio>
<el-radio :label="1">自定义链接</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="" prop="url" v-if="formData.close == 1">
<el-form-item label="" prop="page_url" v-if="formData.page_status == 1">
<div class="w-80">
<el-input v-model="formData.url" placeholder="请输入完整的url" />
<el-input v-model="formData.page_url" placeholder="请输入完整的url" />
</div>
</el-form-item>
<el-form-item label="访问链接">
<div class="flex-1 min-w-0 break-words">
{{ formData.url }}
<el-button v-copy="formData.url">复制</el-button>
</div>
</el-form-item>
</el-form>
</el-card>
<footer-btns v-perms="['channel:h5:save']">
<footer-btns v-perms="['channel.web_page_setting/setConfig']">
<el-button type="primary" @click="handelSave">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup name="h5Config">
import { getH5Config, setH5Config } from '@/api/channel/h5'
import feedback from '@/utils/feedback'
const formData = reactive({
status: 0,
close: 0,
url: '',
accessLink: ''
page_status: 0,
page_url: '',
url: ''
})
const getDetail = async () => {
@@ -54,7 +59,6 @@ const getDetail = async () => {
const handelSave = async () => {
await setH5Config(formData)
getDetail()
feedback.msgSuccess('操作成功')
}
getDetail()

View File

@@ -0,0 +1,75 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert
type="warning"
title="温馨提示:填写微信开放平台开发配置,请前往微信开放平台创建应用并完成认证;网站应用配置主要用于网站微信登录和微信支付"
:closable="false"
show-icon
/>
</el-card>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="160px">
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">网站应用</div>
<el-form-item label="AppID" prop="app_id">
<div class="w-80">
<el-input v-model="formData.app_id" placeholder="请输入AppID" />
</div>
</el-form-item>
<el-form-item label="AppSecret" prop="app_secret">
<div>
<div class="w-80">
<el-input v-model="formData.app_secret" placeholder="请输入AppSecret" />
</div>
</div>
</el-form-item>
</el-card>
</el-form>
<footer-btns v-perms="['channel.open_setting/setConfig']">
<el-button type="primary" @click="handelSave">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup name="wxDevConfig">
import { getOpenSettingConfig, setOpenSettingConfig } from '@/api/channel/open_setting'
import type { FormInstance } from 'element-plus'
const formData = reactive({
app_id: '',
app_secret: ''
})
const formRef = shallowRef<FormInstance>()
const formRules = {
app_id: [
{
required: true,
message: '请输入AppID',
trigger: ['blur', 'change']
}
],
app_secret: [
{
required: true,
message: '请输入AppSecret',
trigger: ['blur', 'change']
}
]
}
const getDetail = async () => {
const data = await getOpenSettingConfig()
for (const key in formData) {
//@ts-ignore
formData[key] = data[key]
}
}
const handelSave = async () => {
await formRef.value?.validate()
await setOpenSettingConfig(formData)
getDetail()
}
getDetail()
</script>

View File

@@ -8,7 +8,12 @@
show-icon
/>
</el-card>
<el-form ref="formRef" :model="formData" label-width="160px">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
:label-width="appStore.isMobile ? '80px' : '160px'"
>
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">微信小程序</div>
<el-form-item label="小程序名称" prop="name">
@@ -16,15 +21,15 @@
<el-input v-model="formData.name" placeholder="请输入小程序名称" />
</div>
</el-form-item>
<el-form-item label="原始ID" prop="primaryId">
<el-form-item label="原始ID" prop="original_id">
<div class="w-80">
<el-input v-model="formData.primaryId" placeholder="请输入原始ID" />
<el-input v-model="formData.original_id" placeholder="请输入原始ID" />
</div>
</el-form-item>
<el-form-item label="小程序码" prop="qrCode">
<div>
<el-form-item label="小程序码" prop="qr_code">
<div class="flex-1">
<div>
<material-picker v-model="formData.qrCode" :limit="1" />
<material-picker v-model="formData.qr_code" :limit="1" />
</div>
<div class="form-tips">建议尺寸宽400px*高400pxjpgjpegpng格式</div>
</div>
@@ -32,16 +37,14 @@
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">开发者ID</div>
<el-form-item label="AppID" prop="appId">
<el-form-item label="AppID" prop="app_id">
<div class="w-80">
<el-input v-model="formData.appId" placeholder="请输入AppID" />
<el-input v-model="formData.app_id" placeholder="请输入AppID" />
</div>
</el-form-item>
<el-form-item label="AppSecret" prop="appSecret">
<div>
<div class="w-80">
<el-input v-model="formData.appSecret" placeholder="请输入AppSecret" />
</div>
<el-form-item label="AppSecret" prop="app_secret">
<div class="w-80">
<el-input v-model="formData.app_secret" placeholder="请输入AppSecret" />
</div>
</el-form-item>
<el-form-item>
@@ -53,12 +56,12 @@
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">服务器域名</div>
<el-form-item label="request合法域名" prop="appId">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.requestDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.request_domain" disabled />
</div>
<el-button v-copy="formData.requestDomain">复制</el-button>
<el-button v-copy="formData.request_domain">复制</el-button>
</div>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->服务器域名填写https协议域名
@@ -66,12 +69,12 @@
</div>
</el-form-item>
<el-form-item label="socket合法域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.socketDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.socket_domain" disabled />
</div>
<el-button v-copy="formData.socketDomain">复制</el-button>
<el-button v-copy="formData.socket_domain">复制</el-button>
</div>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->服务器域名填写wss协议域名
@@ -79,12 +82,12 @@
</div>
</el-form-item>
<el-form-item label="uploadFile合法域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.uploadFileDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.upload_file_domain" disabled />
</div>
<el-button v-copy="formData.uploadFileDomain">复制</el-button>
<el-button v-copy="formData.upload_file_domain">复制</el-button>
</div>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->服务器域名填写https协议域名
@@ -92,12 +95,12 @@
</div>
</el-form-item>
<el-form-item label="downloadFile合法域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.downloadFileDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.download_file_domain" disabled />
</div>
<el-button v-copy="formData.downloadFileDomain">复制</el-button>
<el-button v-copy="formData.download_file_domain">复制</el-button>
</div>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->服务器域名填写https协议域名
@@ -105,12 +108,12 @@
</div>
</el-form-item>
<el-form-item label="udp合法域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.udpDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.udp_domain" disabled />
</div>
<el-button v-copy="formData.udpDomain">复制</el-button>
<el-button v-copy="formData.udp_domain">复制</el-button>
</div>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->服务器域名填写udp协议域名
@@ -121,12 +124,12 @@
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">业务域名</div>
<el-form-item label="业务域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.businessDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.business_domain" disabled />
</div>
<el-button v-copy="formData.businessDomain">复制</el-button>
<el-button v-copy="formData.business_domain">复制</el-button>
</div>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->业务域名填写业务域名
@@ -135,30 +138,48 @@
</el-form-item>
</el-card>
</el-form>
<footer-btns v-perms="['channel:mp:save']">
<footer-btns v-perms="['channel.mnp_settings/setConfig']">
<el-button type="primary" @click="handelSave">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup name="weappConfig">
import { getWeappConfig, setWeappConfig } from '@/api/channel/weapp'
import feedback from '@/utils/feedback'
import useAppStore from '@/stores/modules/app'
import type { FormInstance } from 'element-plus'
const appStore = useAppStore()
const formData = reactive({
name: '',
primaryId: '',
qrCode: '',
appId: '',
appSecret: '',
businessDomain: '',
downloadFileDomain: '',
requestDomain: '',
socketDomain: '',
original_id: '',
qr_code: '',
app_id: '',
app_secret: '',
business_domain: '',
download_file_domain: '',
request_domain: '',
socket_domain: '',
tcpDomain: '',
udpDomain: '',
uploadFileDomain: ''
udp_domain: '',
upload_file_domain: ''
})
const formRef = shallowRef<FormInstance>()
const formRules = {
app_id: [
{
required: true,
message: '请输入AppID',
trigger: ['blur', 'change']
}
],
app_secret: [
{
required: true,
message: '请输入AppSecret',
trigger: ['blur', 'change']
}
]
}
const getDetail = async () => {
const data = await getWeappConfig()
for (const key in formData) {
@@ -168,9 +189,9 @@ const getDetail = async () => {
}
const handelSave = async () => {
await formRef.value?.validate()
await setWeappConfig(formData)
getDetail()
feedback.msgSuccess('操作成功')
}
getDetail()

View File

@@ -1,62 +0,0 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert
type="warning"
title="温馨提示填写微信开放平台开发配置请前往微信开放平台创建应用并完成认证APP应用配置主要用于APP微信登录和微信支付"
:closable="false"
show-icon
/>
</el-card>
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">APP应用</div>
<el-form-item label="AppID" prop="appId">
<div class="w-80">
<el-input v-model="formData.appId" placeholder="请输入AppID" />
</div>
</el-form-item>
<el-form-item label="AppSecret" prop="appSecret">
<div>
<div class="w-80">
<el-input v-model="formData.appSecret" placeholder="请输入AppSecret" />
</div>
</div>
</el-form-item>
<el-form-item>
<div class="form-tips">
小程序账号登录微信公众平台点击开发>开发设置->开发者ID设置AppID和AppSecret
</div>
</el-form-item>
</el-card>
</el-form>
<footer-btns v-perms="['channel:wx:save']">
<el-button type="primary" @click="handelSave">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup name="wxDevConfig">
import { getWxDevConfig, setWxDevConfig } from '@/api/channel/wx_dev'
import feedback from '@/utils/feedback'
const formData = reactive({
appId: '',
appSecret: ''
})
const getDetail = async () => {
const data = await getWxDevConfig()
for (const key in formData) {
//@ts-ignore
formData[key] = data[key]
}
}
const handelSave = async () => {
await setWxDevConfig(formData)
getDetail()
feedback.msgSuccess('操作成功')
}
getDetail()
</script>

View File

@@ -8,7 +8,12 @@
show-icon
/>
</el-card>
<el-form ref="formRef" :model="formData" label-width="160px">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
:label-width="appStore.isMobile ? '80px' : '160px'"
>
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">微信公众号</div>
<el-form-item label="公众号名称" prop="name">
@@ -16,15 +21,15 @@
<el-input v-model="formData.name" placeholder="请输入公众号名称" />
</div>
</el-form-item>
<el-form-item label="原始ID" prop="primaryId">
<el-form-item label="原始ID" prop="original_id">
<div class="w-80">
<el-input v-model="formData.primaryId" placeholder="请输入原始ID" />
<el-input v-model="formData.original_id" placeholder="请输入原始ID" />
</div>
</el-form-item>
<el-form-item label="公众号二维码" prop="qrCode">
<el-form-item label="公众号二维码" prop="qr_code">
<div>
<div>
<material-picker v-model="formData.qrCode" :limit="1" />
<material-picker v-model="formData.qr_code" :limit="1" />
</div>
<div class="form-tips">建议尺寸宽400px*高400pxjpgjpegpng格式</div>
</div>
@@ -32,16 +37,14 @@
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">公众号开发者信息</div>
<el-form-item label="AppID" prop="appId">
<el-form-item label="AppID" prop="app_id">
<div class="w-80">
<el-input v-model="formData.appId" placeholder="请输入AppID" />
<el-input v-model="formData.app_id" placeholder="请输入AppID" />
</div>
</el-form-item>
<el-form-item label="AppSecret" prop="appSecret">
<div>
<div class="w-80">
<el-input v-model="formData.appSecret" placeholder="请输入AppSecret" />
</div>
<el-form-item label="AppSecret" prop="app_secret">
<div class="w-80">
<el-input v-model="formData.app_secret" placeholder="请输入AppSecret" />
</div>
</el-form-item>
<el-form-item>
@@ -53,9 +56,9 @@
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">服务器配置</div>
<el-form-item label="URL">
<div>
<div class="flex">
<div class="mr-4 w-80">
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.url" disabled />
</div>
<el-button v-copy="formData.url">复制</el-button>
@@ -66,7 +69,7 @@
</div>
</el-form-item>
<el-form-item label="Token" prop="Token">
<div>
<div class="flex-1 min-w-0">
<div class="w-80">
<el-input v-model="formData.token" placeholder="请输入Token" />
</div>
@@ -75,11 +78,11 @@
</div>
</div>
</el-form-item>
<el-form-item label="EncodingAESKey" prop="EncodingAESKey">
<div>
<el-form-item label="EncodingAESKey" prop="encoding_aes_key">
<div class="flex-1 min-w-0">
<div class="w-80">
<el-input
v-model="formData.encodingAesKey"
v-model="formData.encoding_aes_key"
placeholder="请输入EncodingAESKey"
/>
</div>
@@ -88,11 +91,11 @@
</div>
</div>
</el-form-item>
<el-form-item label="消息加密方式" required prop="status">
<div>
<el-form-item label="消息加密方式" required prop="encryption_type">
<div class="flex-1 min-w-0">
<el-radio-group
class="flex-col !items-start"
v-model="formData.encryptionType"
class="flex-col !items-start min-w-0"
v-model="formData.encryption_type"
>
<el-radio :label="1">
明文模式 (不使用消息体加解密功能安全系数较低)
@@ -111,12 +114,12 @@
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">功能设置</div>
<el-form-item label="业务域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.businessDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.business_domain" disabled />
</div>
<el-button v-copy="formData.businessDomain">复制</el-button>
<el-button v-copy="formData.business_domain">复制</el-button>
</div>
<div class="form-tips">
登录微信公众平台点击设置>公众号设置>功能设置填写业务域名
@@ -124,12 +127,12 @@
</div>
</el-form-item>
<el-form-item label="JS接口安全域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.jsDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.js_secure_domain" disabled />
</div>
<el-button v-copy="formData.jsDomain">复制</el-button>
<el-button v-copy="formData.js_secure_domain">复制</el-button>
</div>
<div class="form-tips">
登录微信公众平台点击设置>公众号设置>功能设置填写JS接口安全域名
@@ -137,12 +140,12 @@
</div>
</el-form-item>
<el-form-item label="网页授权域名">
<div>
<div class="flex">
<div class="mr-4 w-80">
<el-input v-model="formData.webDomain" disabled />
<div class="flex-1 min-w-0">
<div class="sm:flex">
<div class="mr-4 sm:w-80 flex">
<el-input v-model="formData.web_auth_domain" disabled />
</div>
<el-button v-copy="formData.webDomain">复制</el-button>
<el-button v-copy="formData.web_auth_domain">复制</el-button>
</div>
<div class="form-tips">
登录微信公众平台点击设置>公众号设置>功能设置填写网页授权域名
@@ -151,32 +154,49 @@
</el-form-item>
</el-card>
</el-form>
<footer-btns v-perms="['channel:h5:save']">
<footer-btns v-perms="['channel.official_account_setting/setConfig']">
<el-button type="primary" @click="handelSave">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup name="wxOaConfig">
import { getOaConfig, setOaConfig } from '@/api/channel/wx_oa'
import feedback from '@/utils/feedback'
import { useClipboard } from '@vueuse/core'
import useAppStore from '@/stores/modules/app'
import type { FormInstance } from 'element-plus'
const appStore = useAppStore()
const formData = reactive({
name: '',
primaryId: ' ',
qrCode: '',
appId: '',
appSecret: '',
original_id: ' ',
qr_code: '',
app_id: '',
app_secret: '',
url: '',
token: '',
encodingAesKey: '',
encryptionType: 1,
businessDomain: '',
jsDomain: '',
webDomain: ''
encoding_aes_key: '',
encryption_type: 1,
business_domain: '',
js_secure_domain: '',
web_auth_domain: ''
})
const { copy } = useClipboard()
const formRef = shallowRef<FormInstance>()
const formRules = {
app_id: [
{
required: true,
message: '请输入AppID',
trigger: ['blur', 'change']
}
],
app_secret: [
{
required: true,
message: '请输入AppSecret',
trigger: ['blur', 'change']
}
]
}
const getDetail = async () => {
const data = await getOaConfig()
for (const key in formData) {
@@ -186,9 +206,9 @@ const getDetail = async () => {
}
const handelSave = async () => {
await formRef.value?.validate()
await setOaConfig(formData)
getDetail()
feedback.msgSuccess('操作成功')
}
getDetail()

View File

@@ -19,12 +19,14 @@ getOaMenuFunc()
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div class="flex flex-1">
<div class="lg:flex flex-1">
<!-- Phone -->
<oa-phone></oa-phone>
<!-- Attr -->
<oa-attr></oa-attr>
<div class="mt-4 lg:mt-0 max-w-[400px]">
<oa-attr></oa-attr>
</div>
</div>
</el-card>

View File

@@ -18,27 +18,27 @@ const {
<template>
<!-- Attr -->
<template v-for="(attrItem, attrIndex) in menuList" :key="attrIndex">
<div class="flex-1 oa-attr" v-show="attrIndex === menuIndex">
<div class="flex-1 oa-attr min-w-0" v-show="attrIndex === menuIndex">
<div class="text-base oa-attr-title">菜单配置</div>
<del-wrap class="w-3/4" @close="handleDelMenu(menuIndex)">
<del-wrap @close="handleDelMenu(menuIndex)">
<div class="flex items-center w-full p-4 mt-4 rounded bg-fill-light">
<oa-menu-form
ref="menuRef"
modular="master"
v-model:name="attrItem.name"
v-model:menuType="attrItem.menuType"
v-model:visitType="attrItem.visitType"
v-model:menuType="attrItem.has_menu"
v-model:visitType="attrItem.type"
v-model:url="attrItem.url"
v-model:appId="attrItem.appId"
v-model:pagePath="attrItem.pagePath"
v-model:appId="attrItem.appid"
v-model:pagePath="attrItem.pagepath"
>
<div class="flex-1">
<!-- 编辑子菜单 -->
<ul>
<li
class="flex"
v-for="(subItem, subIndex) in attrItem.subButtons"
v-for="(subItem, subIndex) in attrItem.sub_button"
:key="subIndex"
style="padding: 8px"
>
@@ -49,14 +49,18 @@ const {
:subItem="subItem"
@edit="handleEditSubMenu($event, subIndex)"
>
<el-icon><EditPen /></el-icon>
<el-button link>
<el-icon><EditPen /></el-icon>
</el-button>
</oa-menu-form-edit>
<!-- 删除子菜单 -->
<popup @confirm="handleDelSubMenu(menuIndex, subIndex)">
是否删除当前子菜单
<template #trigger>
<el-icon class="ml-5"><Delete /></el-icon>
<el-button link>
<el-icon class="ml-5"><Delete /></el-icon>
</el-button>
</template>
</popup>
</li>
@@ -67,9 +71,10 @@ const {
<el-button
type="primary"
link
:disabled="attrItem.subButtons.length >= 5"
>添加子菜单({{ attrItem.subButtons.length }}/5)</el-button
:disabled="attrItem.sub_button.length >= 5"
>
添加子菜单({{ attrItem.sub_button.length }}/5)
</el-button>
</oa-menu-form-edit>
</div>
</oa-menu-form>

View File

@@ -22,10 +22,10 @@ const menuFromPopupRef = shallowRef()
const form = {
name: '',
visitType: 'view',
type: 'view',
url: '',
appId: '',
pagePath: ''
appid: '',
pagepath: ''
}
watchEffect(() => {
@@ -61,10 +61,10 @@ const handleRules = async () => {
ref="menuFormEditRef"
modular="secondary"
v-model:name="form.name"
v-model:visitType="form.visitType"
v-model:visitType="form.type"
v-model:url="form.url"
v-model:appId="form.appId"
v-model:pagePath="form.pagePath"
v-model:appId="form.appid"
v-model:pagePath="form.pagepath"
></oa-menu-form>
<template #trigger>
<slot></slot>

View File

@@ -1,5 +1,5 @@
<template>
<el-form ref="menuFormRef" :rules="rules" :model="menuForm" label-width="120px" class="pr-10">
<el-form ref="menuFormRef" :rules="rules" :model="menuForm" label-width="100px">
<!-- 菜单名称 -->
<el-form-item :label="modular === 'master' ? '主菜单名称' : '子菜单名称'" prop="name">
<el-input v-model="menuForm.name" />
@@ -8,15 +8,15 @@
<!-- 菜单类型 -->
<el-form-item label="主菜单类型" prop="menuType" v-if="modular === 'master'">
<el-radio-group v-model="menuForm.menuType">
<el-radio :label="1">不配置子菜单</el-radio>
<el-radio :label="2">配置子菜单</el-radio>
<el-radio :label="false">不配置子菜单</el-radio>
<el-radio :label="true">配置子菜单</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="" v-if="menuForm.menuType === 2 && modular === 'master'">
<el-form-item label="" v-if="menuForm.menuType && modular === 'master'">
<slot></slot>
</el-form-item>
<template v-if="menuForm.menuType === 1">
<template v-if="!menuForm.menuType">
<!-- 跳转链接 -->
<el-form-item label="跳转链接" prop="visitType">
<el-radio-group v-model="menuForm.visitType">
@@ -54,6 +54,7 @@ const emit = defineEmits([
'update:menuType',
'update:visitType',
'update:url',
'update:appId',
'update:pagePath'
])
@@ -61,7 +62,7 @@ const props = withDefaults(
defineProps<{
modular?: string
name?: string
menuType?: number
menuType?: boolean
visitType?: string
url?: string
appId?: string
@@ -70,7 +71,7 @@ const props = withDefaults(
{
modular: 'master',
name: '',
menuType: 1,
menuType: false,
visitType: 'view',
url: '',
appId: '',

View File

@@ -34,9 +34,9 @@ const { menuList, menuIndex, handleAddMenu } = useMenuOa(useMenuOa)
<!-- 二级菜单 -->
<div
class="oa-phone-menu-subitem"
v-show="menuItem.subButtons.length && menuItem.menuType != 1"
v-show="menuItem.sub_button.length && menuItem.has_menu"
>
<template v-for="(subItem, index2) in menuItem.subButtons">
<template v-for="(subItem, index2) in menuItem.sub_button" :key="index2">
<div class="oa-phone-menu-subitem-title">
{{ subItem.name }}
</div>
@@ -61,7 +61,7 @@ const { menuList, menuIndex, handleAddMenu } = useMenuOa(useMenuOa)
width: 260px;
height: 461px;
border: 1px solid #e5e5ea;
flex: none;
&-content {
height: 420px;
border-bottom: 1px solid #e5e5ea;

View File

@@ -47,7 +47,7 @@ export const rules = reactive<FormRules>({
},
{
pattern:
/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/,
/(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/,
message: '请输入合法的网址链接',
trigger: ['blur', 'change']
}
@@ -75,39 +75,42 @@ export const useMenuOa = (ref: any) => {
const handleAddMenu = () => {
menuList.value.push({
name: '菜单名称',
menuType: 1,
visitType: 'view',
has_menu: false,
type: 'view',
url: '',
appId: '',
pagePath: '',
subButtons: []
appid: '',
pagepath: '',
sub_button: []
})
}
// 添加子菜单
const handleAddSubMenu = (event?: Menu) => {
const index = menuIndex.value
if (menuList.value[index].subButtons.length >= 5) {
if (menuList.value[index].sub_button.length >= 5) {
feedback.msgError('已添加上限~')
return
}
menuList.value[index].subButtons.push(event)
menuList.value[index].sub_button.push(event)
}
// 编辑子菜单
const handleEditSubMenu = (event: Menu, subIndex: number) => {
const index = menuIndex.value
menuList.value[index].subButtons[subIndex] = event
menuList.value[index].sub_button[subIndex] = event
}
// 删除主菜单
const handleDelMenu = (index: number) => {
if (index != 0) {
menuIndex.value--
}
menuList.value.splice(index, 1)
}
// 删除子菜单
const handleDelSubMenu = (index: number, subIndex: number) => {
menuList.value[index].subButtons.splice(subIndex, 1)
menuList.value[index].sub_button.splice(subIndex, 1)
}
// 获取菜单
@@ -131,7 +134,6 @@ export const useMenuOa = (ref: any) => {
}
}
await setOaMenuSave(menuList.value)
feedback.msgSuccess('保存成功')
}
// 保存菜单
@@ -146,7 +148,6 @@ export const useMenuOa = (ref: any) => {
}
}
await setOaMenuPublish(menuList.value)
feedback.msgSuccess('发布成功')
}
return {

View File

@@ -10,12 +10,7 @@
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div>
<el-button
v-perms="['channel:oaReplyDefault:add']"
class="mb-4"
type="primary"
@click="handleAdd()"
>
<el-button class="mb-4" type="primary" @click="handleAdd()">
<template #icon>
<icon name="el-icon-Plus" />
</template>
@@ -26,14 +21,13 @@
<el-table-column label="规则名称" prop="name" min-width="120" />
<el-table-column label="回复类型" min-width="120">
<template #default="{ row }">
{{ getContentType(row.contentType) }}
{{ getContentType(row.content_type) }}
</template>
</el-table-column>
<el-table-column label="回复内容" prop="content" min-width="120" />
<el-table-column label="状态" min-width="120">
<template #default="{ row }">
<el-switch
v-perms="['channel:oaReplyDefault:status']"
v-model="row.status"
:active-value="1"
:inactive-value="0"
@@ -44,20 +38,8 @@
<el-table-column label="排序" prop="sort" min-width="120" />
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button
v-perms="['channel:oaReplyDefault:edit']"
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
v-perms="['channel:oaReplyDefault:del']"
type="danger"
link
@click="handleDelete(row.id)"
>
<el-button type="primary" link @click="handleEdit(row)"> 编辑 </el-button>
<el-button type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
</template>
@@ -77,7 +59,7 @@ import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const showEdit = ref(false)
const type = 'default'
const getContentType = computed(() => {
return (val: number) => {
switch (val) {
@@ -90,34 +72,33 @@ const getContentType = computed(() => {
const { pager, getLists } = usePaging({
fetchFun: getOaReplyList,
params: {
type
reply_type: 3
}
})
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add', type)
editRef.value?.open('add', 1)
}
const handleEdit = async (data: any) => {
showEdit.value = true
await nextTick()
editRef.value?.open('edit', type)
editRef.value?.open('edit', 1)
editRef.value?.getDetail(data)
}
const handleDelete = async (id: number) => {
await feedback.confirm('确定要删除?')
await oaReplyDel({ id, type })
await oaReplyDel({ id })
feedback.msgSuccess('删除成功')
getLists()
}
const changeStatus = async (id: number) => {
try {
await changeOaReplyStatus({ id, type })
feedback.msgSuccess('修改成功')
await changeOaReplyStatus({ id })
getLists()
} catch (error) {
getLists()

View File

@@ -21,29 +21,24 @@
<div class="form-tips">方便通过名称管理关注回复内容</div>
</div>
</el-form-item>
<el-form-item label="关键词" prop="keyword" v-if="formData.type == 'keyword'">
<el-form-item label="关键词" prop="keyword" v-if="formData.reply_type == 2">
<div class="flex-1">
<el-input v-model="formData.keyword" placeholder="请输入关键词" />
<div class="form-tips">方便通过名称管理关注回复内容</div>
</div>
</el-form-item>
<el-form-item
label="匹配方式"
prop="matchingType"
:min="0"
v-if="formData.type == 'keyword'"
>
<el-form-item label="匹配方式" prop="matching_type" v-if="formData.reply_type == 2">
<div class="flex-1">
<el-radio-group v-model="formData.matchingType">
<el-radio-group v-model="formData.matching_type">
<el-radio :label="1">全匹配</el-radio>
<el-radio :label="2">模糊匹配</el-radio>
</el-radio-group>
<div class="form-tips">模糊匹配时关键词部分匹配用户输入的内容即可</div>
</div>
</el-form-item>
<el-form-item label="回复类型" prop="contentType" :min="0">
<el-form-item label="回复类型" prop="content_type" :min="0">
<div class="flex-1">
<el-radio-group v-model="formData.contentType">
<el-radio-group v-model="formData.content_type">
<el-radio :label="1">文本</el-radio>
</el-radio-group>
<div class="form-tips">暂时只支持文本类型</div>
@@ -61,19 +56,26 @@
/>
</div>
</el-form-item>
<!-- <el-form-item label="回复数量" prop="sort" :min="0">
<div>
<el-radio-group v-model="formData.replyType">
<el-radio :label="1">回复匹配首词条</el-radio>
</el-radio-group>
<div class="form-tips">设置关键词匹配多条时回复的数量暂时支持回复一条内容</div>
</div>
</el-form-item> -->
<el-form-item label="排序">
<div class="flex-1">
<el-input-number v-model="formData.sort" :min="0" :max="9999" />
</div>
</el-form-item>
<el-form-item
label="回复数量"
prop="reply_num"
required
v-if="formData.reply_type == 2"
>
<div class="flex-1">
<el-radio-group v-model="formData.reply_num">
<el-radio :label="1">回复匹配首词条</el-radio>
</el-radio-group>
<div class="form-tips">
设置关键词匹配多条时回复的数量暂时支持回复一条内容
</div>
</div>
</el-form-item>
<el-form-item label="启用状态">
<el-switch v-model="formData.status" :active-value="1" :inactive-value="0" />
</el-form-item>
@@ -85,7 +87,6 @@
import type { FormInstance } from 'element-plus'
import { oaReplyEdit, oaReplyAdd, getOaReplyDetail } from '@/api/channel/wx_oa'
import Popup from '@/components/popup/index.vue'
import feedback from '@/utils/feedback'
import type { FormRules } from 'element-plus'
const emit = defineEmits(['success', 'close'])
@@ -94,18 +95,19 @@ const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑栏目' : '新增栏目'
return mode.value == 'edit' ? '编辑' : '新增'
})
const formData = reactive({
id: '',
name: '',
type: '',
contentType: 1,
reply_type: 0,
content_type: 1,
keyword: '',
content: '',
matchingType: 1,
matching_type: 1,
status: 1,
sort: 0
sort: 0,
reply_num: 1
})
const formRules: FormRules = {
@@ -123,14 +125,14 @@ const formRules: FormRules = {
trigger: ['blur']
}
],
matchingType: [
matching_type: [
{
required: true,
message: '请选择匹配方式',
trigger: ['blur']
}
],
contentType: [
content_type: [
{
required: true,
message: '请选择回复类型',
@@ -149,14 +151,13 @@ const formRules: FormRules = {
const handleSubmit = async () => {
await formRef.value?.validate()
mode.value == 'edit' ? await oaReplyEdit(formData) : await oaReplyAdd(formData)
feedback.msgSuccess('操作成功')
popupRef.value?.close()
emit('success')
}
const open = (modes = 'add', type = '') => {
const open = (modes = 'add', type = 0) => {
mode.value = modes
formData.type = type
formData.reply_type = type
popupRef.value?.open()
}
@@ -171,8 +172,7 @@ const setFormData = (data: Record<any, any>) => {
const getDetail = async (row: Record<string, any>) => {
const data = await getOaReplyDetail({
id: row.id,
type: formData.type
id: row.id
})
setFormData(data)
}

View File

@@ -10,12 +10,7 @@
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div>
<el-button
v-perms="['channel:oaReplyFollow:add']"
class="mb-4"
type="primary"
@click="handleAdd()"
>
<el-button class="mb-4" type="primary" @click="handleAdd()">
<template #icon>
<icon name="el-icon-Plus" />
</template>
@@ -26,14 +21,13 @@
<el-table-column label="规则名称" prop="name" min-width="120" />
<el-table-column label="回复类型" min-width="120">
<template #default="{ row }">
{{ getContentType(row.contentType) }}
{{ getContentType(row.content_type) }}
</template>
</el-table-column>
<el-table-column label="回复内容" prop="content" min-width="120" />
<el-table-column label="状态" min-width="120">
<template #default="{ row }">
<el-switch
v-perms="['channel:oaReplyFollow:status']"
v-model="row.status"
:active-value="1"
:inactive-value="0"
@@ -44,20 +38,8 @@
<el-table-column label="排序" prop="sort" min-width="120" />
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button
v-perms="['channel:oaReplyFollow:edit']"
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
v-perms="['channel:oaReplyFollow:del']"
type="danger"
link
@click="handleDelete(row.id)"
>
<el-button type="primary" link @click="handleEdit(row)"> 编辑 </el-button>
<el-button type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
</template>
@@ -75,10 +57,9 @@ import { oaReplyDel, getOaReplyList, changeOaReplyStatus } from '@/api/channel/w
import { usePaging } from '@/hooks/usePaging'
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const showEdit = ref(false)
const type = 'follow'
const getContentType = computed(() => {
return (val: number) => {
switch (val) {
@@ -91,34 +72,32 @@ const getContentType = computed(() => {
const { pager, getLists } = usePaging({
fetchFun: getOaReplyList,
params: {
type
reply_type: 1
}
})
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add', type)
editRef.value?.open('add', 1)
}
const handleEdit = async (data: any) => {
showEdit.value = true
await nextTick()
editRef.value?.open('edit', type)
editRef.value?.open('edit', 1)
editRef.value?.getDetail(data)
}
const handleDelete = async (id: number) => {
await feedback.confirm('确定要删除?')
await oaReplyDel({ id, type })
feedback.msgSuccess('删除成功')
await oaReplyDel({ id })
getLists()
}
const changeStatus = async (id: number) => {
try {
await changeOaReplyStatus({ id, type })
feedback.msgSuccess('修改成功')
await changeOaReplyStatus({ id })
getLists()
} catch (error) {
getLists()

View File

@@ -10,12 +10,7 @@
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div>
<el-button
v-perms="['channel:oaReplyKeyword:add']"
class="mb-4"
type="primary"
@click="handleAdd()"
>
<el-button class="mb-4" type="primary" @click="handleAdd()">
<template #icon>
<icon name="el-icon-Plus" />
</template>
@@ -28,18 +23,17 @@
<el-table-column label="关键词" prop="keyword" min-width="120" />
<el-table-column label="匹配方式" min-width="120">
<template #default="{ row }">
{{ getMatchingType(row.matchingType) }}
{{ getMatchingType(row.matching_type) }}
</template>
</el-table-column>
<el-table-column label="回复类型" min-width="120">
<template #default="{ row }">
{{ getContentType(row.contentType) }}
{{ getContentType(row.content_type) }}
</template>
</el-table-column>
<el-table-column label="状态" min-width="120">
<template #default="{ row }">
<el-switch
v-perms="['channel:oaReplyKeyword:status']"
v-model="row.status"
:active-value="1"
:inactive-value="0"
@@ -50,20 +44,8 @@
<el-table-column label="排序" prop="sort" min-width="120" />
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button
v-perms="['channel:oaReplyKeyword:edit']"
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
v-perms="['channel:oaReplyKeyword:del']"
type="danger"
link
@click="handleDelete(row.id)"
>
<el-button type="primary" link @click="handleEdit(row)"> 编辑 </el-button>
<el-button type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
</template>
@@ -103,38 +85,35 @@ const getContentType = computed(() => {
}
}
})
const type = 'keyword'
const { pager, getLists } = usePaging({
fetchFun: getOaReplyList,
params: {
type
reply_type: 2
}
})
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add', type)
editRef.value?.open('add', 2)
}
const handleEdit = async (data: any) => {
showEdit.value = true
await nextTick()
editRef.value?.open('edit', type)
editRef.value?.open('edit', 2)
editRef.value?.getDetail(data)
}
const handleDelete = async (id: number) => {
await feedback.confirm('确定要删除?')
await oaReplyDel({ id, type })
feedback.msgSuccess('删除成功')
await oaReplyDel({ id })
getLists()
}
const changeStatus = async (id: number) => {
try {
await changeOaReplyStatus({ id, type })
feedback.msgSuccess('修改成功')
await changeOaReplyStatus({ id })
getLists()
} catch (error) {
getLists()

View File

@@ -13,9 +13,9 @@
<div class="basis-40 flex flex-col justify-center items-center">
<div class="text-tx-regular">账户余额</div>
<div class="mt-2 flex items-center">
¥{{ formData.userMoney }}
¥{{ formData.user_money }}
<el-button v-perms="['system:user:adjustMoney']" type="primary" link
@click="handleAdjust(formData.userMoney)">
@click="handleAdjust(formData.user_money)">
调整
</el-button>
</div>
@@ -35,7 +35,7 @@
</popover-input>
</el-form-item>
<el-form-item label="真实姓名:">
{{ formData.realName || '-' }}
{{ formData.real_name || '-' }}
<popover-input class="ml-[10px]" @confirm="handleEdit($event, 'real_name')" :limit="32"
v-perms="['system:user:edit']">
<el-button type="primary" link>
@@ -74,8 +74,8 @@
</popover-input>
</el-form-item>
<el-form-item label="注册来源:"> {{ formData.channel }} </el-form-item>
<el-form-item label="注册时间:"> {{ formData.createTime }} </el-form-item>
<el-form-item label="最近登录时间:"> {{ formData.loginTime }} </el-form-item>
<el-form-item label="注册时间:"> {{ formData.create_time }} </el-form-item>
<el-form-item label="最近登录时间:"> {{ formData.login_time }} </el-form-item>
</el-form>
</el-card>
@@ -93,15 +93,15 @@ const route = useRoute()
const formData = reactive({
avatar: '',
channel: '',
createTime: '',
loginTime: '',
create_time: '',
login_time: '',
mobile: '',
nickname: '',
realName: 0,
real_name: 0,
sex: 0,
sn: '',
account: '',
userMoney: ''
user_money: ''
})
const id: number = parseInt(route.query.id?.toString() ?? "", 10)

View File

@@ -0,0 +1,82 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert type="warning" title="温馨提示:用户账户变动记录" :closable="false" show-icon></el-alert>
<el-form ref="formRef" class="mb-[-16px] mt-[16px]" :model="queryParams" :inline="true">
<el-form-item label="用户信息">
<el-input class="w-[280px]" v-model="queryParams.user_info" placeholder="请输入用户编号" clearable
@keyup.enter="resetPage" />
</el-form-item>
<el-form-item label="变动类型">
<el-select class="w-[280px]" v-model="queryParams.change_type" clearable>
<el-option label="全部" value />
<el-option v-for="(value, key) in optionsData.change_type" :key="key" :label="value" :value="key" />
</el-select>
</el-form-item>
<el-form-item label="记录时间">
<daterange-picker v-model:startTime="queryParams.start_time" v-model:endTime="queryParams.end_time" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="用户编号" prop="user.sn" min-width="100" />
<el-table-column label="用户昵称" min-width="160">
<template #default="{ row }">
<div class="flex items-center">
<image-contain class="flex-none mr-2" :src="row.user.avatar" :width="40" :height="40"
preview-teleported fit="contain" />
{{ row.user.nickname }}
</div>
</template>
</el-table-column>
<el-table-column label="手机号码" prop="user.mobile" min-width="100" />
<el-table-column label="变动金额" prop="change_amount" min-width="100">
<template #default="{ row }">
<span :class="{ 'text-error': row.action == 2 }">
{{ row.action == 2 ? '- ' + row.change_amount : '+ ' + row.change_amount }}
</span>
</template>
</el-table-column>
<el-table-column label="剩余金额" prop="left_amount" min-width="100" />
<el-table-column label="变动类型" prop="change_type_desc" min-width="120" />
<el-table-column label="来源单号" prop="source_sn" min-width="100" />
<el-table-column label="记录时间" prop="create_time" min-width="120" />
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="articleLists">
import { getUmChangeType, accountLog } from '@/api/finance'
import { useDictOptions } from '@/hooks/useDictOptions'
import { usePaging } from '@/hooks/usePaging'
const queryParams = reactive({
user_info: '',
change_type: '',
start_time: '',
end_time: ''
})
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: accountLog,
params: queryParams
})
const { optionsData } = useDictOptions<{
change_type: Record<number, string>
}>({
change_type: {
api: getUmChangeType
}
})
getLists()
</script>

View File

@@ -0,0 +1,68 @@
<template>
<div class="code-preview">
<el-dialog v-model="show" width="760px" title="退款日志">
<el-table size="large" v-loading="loading" :data="logLists" height="500">
<el-table-column label="流水单号" prop="sn" min-width="190" />
<el-table-column label="退款金额" min-width="110">
<template #default="{ row }"> ¥{{ row.refund_amount }} </template>
</el-table-column>
<el-table-column label="退款状态" prop="" min-width="100">
<template #default="{ row }">
<el-tag type="warning" v-if="row.refund_status == 0">
{{ row.refund_status_text }}
</el-tag>
<el-tag v-if="row.refund_status == 1">
{{ row.refund_status_text }}
</el-tag>
<el-tag type="danger" v-if="row.refund_status == 2">
{{ row.refund_status_text }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="记录时间" prop="create_time" min-width="180" />
<el-table-column label="操作人" prop="admin.nickname" min-width="120" />
</el-table>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { refundLog } from '@/api/finance'
const loading = ref(false)
const logLists = ref([])
const props = defineProps<{
modelValue: boolean
refundId: number
}>()
const emit = defineEmits<{
(event: 'update:modelValue', value: boolean): void
}>()
const show = computed<boolean>({
get() {
return props.modelValue
},
set(value) {
emit('update:modelValue', value)
}
})
const getRefundLog = async () => {
loading.value = true
logLists.value = []
try {
const res = await refundLog({
record_id: props.refundId
})
logLists.value = res
} catch (error) { }
loading.value = false
}
watch(show, (value) => {
if (value) {
getRefundLog()
}
})
</script>

View File

@@ -0,0 +1,108 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert type="warning" title="温馨提示:用户充值记录" :closable="false" show-icon></el-alert>
<el-form ref="formRef" class="mb-[-16px] mt-[16px]" :model="queryParams" :inline="true">
<el-form-item label="充值单号">
<el-input class="w-[280px]" v-model="queryParams.sn" placeholder="请输入充值单号" clearable
@keyup.enter="resetPage" />
</el-form-item>
<el-form-item label="用户信息">
<el-input class="w-[280px]" v-model="queryParams.user_info" placeholder="请输入用户编号/昵称/手机号" clearable
@keyup.enter="resetPage" />
</el-form-item>
<el-form-item label="支付方式">
<el-select class="w-[280px]" v-model="queryParams.pay_way">
<el-option label="全部" value />
<el-option label="微信支付" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="支付状态">
<el-select class="w-[280px]" v-model="queryParams.pay_status">
<el-option label="全部" value />
<el-option label="未支付" :value="2" />
<el-option label="已支付" :value="1" />
</el-select>
</el-form-item>
<el-form-item label="下单时间">
<daterange-picker v-model:startTime="queryParams.start_time" v-model:endTime="queryParams.end_time" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
<export-data class="ml-2.5" :fetch-fun="rechargeLists" :params="queryParams" :page-size="pager.size" />
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="用户信息" min-width="100">
<template #default="{ row }">
<div class="flex items-center">
<image-contain class="flex-none mr-2" :src="row.user.avatar" :width="40" :height="40"
preview-teleported fit="contain" />
{{ row.nickname }}
</div>
</template>
</el-table-column>
<el-table-column label="用户编号" prop="user_sn" min-width="190" />
<el-table-column label="充值单号" prop="sn" min-width="190" />
<el-table-column label="充值金额" prop="order_amount" min-width="100">
</el-table-column>
<el-table-column label="支付方式" prop="pay_way_text" min-width="100">
<template #default="{ row }">
<el-tag type="success" v-if="row.pay_way == 2">微信支付</el-tag>
<el-tag v-if="row.pay_way == 3">支付宝支付</el-tag>
</template>
</el-table-column>
<el-table-column label="支付状态" min-width="100">
<template #default="{ row }">
<el-tag v-if="row.pay_status == 1">已支付</el-tag>
<el-tag type="info" v-else>未支付</el-tag>
</template>
</el-table-column>
<el-table-column label="支付时间" prop="pay_time" min-width="180" />
<el-table-column label="下单时间" prop="create_time" min-width="180" />
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button v-if="row.pay_status == 1" v-perms="['finance:recharge:refund']" type="primary" link
:disabled="row.refund_status == 1" @click="handleRefund(row.id)">
退款
</el-button>
</template>
</el-table-column>
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="articleLists">
import { rechargeLists, refund } from '@/api/finance'
import { usePaging } from '@/hooks/usePaging'
import feedback from '@/utils/feedback'
const queryParams = reactive({
sn: '',
user_info: '',
pay_way: '',
pay_status: '',
start_time: '',
end_time: ''
})
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: rechargeLists,
params: queryParams
})
const handleRefund = async (id: number) => {
await feedback.confirm('确认重新退款?')
await refund({
recharge_id: id
})
getLists()
}
getLists()
</script>

View File

@@ -0,0 +1,191 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<div class="flex flex-wrap">
<div class="w-1/2 md:w-1/4">
<div class="leading-10">累计退款金额 ()</div>
<div class="text-6xl">{{ refundData.total }}</div>
</div>
<div class="w-1/2 md:w-1/4">
<div class="leading-10">退款中金额 ()</div>
<div class="text-6xl">{{ refundData.ing }}</div>
</div>
<div class="w-1/2 md:w-1/4">
<div class="leading-10">退款成功金额 ()</div>
<div class="text-6xl">{{ refundData.success }}</div>
</div>
<div class="w-1/2 md:w-1/4">
<div class="leading-10">退款失败金额 ()</div>
<div class="text-6xl">{{ refundData.error }}</div>
</div>
</div>
</el-card>
<el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="mb-[-16px] mt-[16px]" :model="queryParams" :inline="true">
<el-form-item label="退款单号">
<el-input class="w-[280px]" v-model="queryParams.sn" placeholder="请输入退款单号" clearable
@keyup.enter="resetPage" />
</el-form-item>
<el-form-item label="来源单号">
<el-input class="w-[280px]" v-model="queryParams.order_sn" placeholder="请输入来源单号" clearable
@keyup.enter="resetPage" />
</el-form-item>
<el-form-item label="用户信息">
<el-input class="w-[280px]" v-model.number="queryParams.user_sn" placeholder="请输入用户编号" clearable
@keyup.enter="resetPage" />
</el-form-item>
<el-form-item label="退款类型">
<el-select class="w-[280px]" v-model="queryParams.refund_type">
<el-option label="全部" value />
<el-option label="后台退款" :value="1" />
</el-select>
</el-form-item>
<el-form-item label="记录时间">
<daterange-picker v-model:startTime="queryParams.start_time" v-model:endTime="queryParams.end_time" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
<!-- <export-data
class="ml-2.5"
:fetch-fun="refundRecord"
:params="queryParams"
:page-size="pager.size"
/> -->
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-tabs v-model="activeTab" @tab-change="handleTabChange">
<el-tab-pane v-for="(item, index) in tabLists" :label="`${item.name}(${pager.extend[item.numKey] ?? 0})`"
:name="index" :key="index">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="退款单号" prop="sn" min-width="190" />
<el-table-column label="用户信息" min-width="160">
<template #default="{ row }">
<div class="flex items-center">
<image-contain class="flex-none mr-2" :src="row.user.avatar" :width="40" :height="40"
preview-teleported fit="contain" />
{{ row.user.nickname }}
</div>
</template>
</el-table-column>
<el-table-column label="来源单号" prop="order_sn" min-width="190" />
<el-table-column label="退款金额" min-width="100">
<template #default="{ row }"> ¥ {{ row.refund_amount }} </template>
</el-table-column>
<el-table-column label="退款类型" prop="refund_type_text" min-width="100" />
<el-table-column label="退款状态" prop="" min-width="100">
<template #default="{ row }">
<el-tag type="warning" v-if="row.refund_status == 0">
{{ row.refund_status_text }}
</el-tag>
<el-tag v-if="row.refund_status == 1">
{{ row.refund_status_text }}
</el-tag>
<el-tag type="danger" v-if="row.refund_status == 2">
{{ row.refund_status_text }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="记录时间" prop="create_time" min-width="180" />
<el-table-column label="操作" width="180" fixed="right">
<template #default="{ row }">
<el-button v-perms="['finance:refund:log']" type="primary" link
@click="handleShowRefundLog(row.id)">
退款日志
</el-button>
<el-button v-if="row.refund_status == 2" v-perms="['finance:recharge:refundAgain']"
type="primary" link @click="handleRefund(row.id)">
重新退款
</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<refund-log v-model="showRefundLog" :refund-id="selectRefundId" />
</div>
</template>
<script lang="ts" setup name="articleLists">
import { refundRecord, refundAgain, refundStat } from '@/api/finance'
import { usePaging } from '@/hooks/usePaging'
import feedback from '@/utils/feedback'
import RefundLog from './component/refund-log.vue'
const queryParams = reactive({
sn: '',
order_sn: '',
user_sn: '',
refund_type: '',
start_time: '',
end_time: '',
refund_status: ''
})
const refundData = reactive({
total: 0,
ing: 0,
success: 0,
error: 0
})
const showRefundLog = ref(false)
const selectRefundId = ref(0)
const activeTab = ref(0)
const tabLists = ref([
{
name: '全部',
type: '',
numKey: 'total'
},
{
name: '退款中',
type: 0,
numKey: 'ing'
},
{
name: '退款成功',
type: 1,
numKey: 'success'
},
{
name: '退款失败',
type: 2,
numKey: 'error'
}
])
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: refundRecord,
params: queryParams
})
const handleRefund = async (id: number) => {
await feedback.confirm('确认重新退款?')
await refundAgain({
record_id: id
})
getLists()
getRefundStat()
}
const handleShowRefundLog = async (id: number) => {
showRefundLog.value = true
selectRefundId.value = id
}
const handleTabChange = (index: any) => {
queryParams.refund_status = tabLists.value[index].type as string
resetPage()
}
const getRefundStat = async () => {
const res = await refundStat()
Object.assign(refundData, res)
}
getRefundStat()
getLists()
</script>

View File

@@ -1,48 +1,36 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-page-header :content="$route.meta.title" @back="$router.back()" />
<el-page-header content="编辑通知设置" @back="$router.back()" />
</el-card>
<el-form
ref="formRef"
:model="formData"
label-width="120px"
:rules="rules"
v-loading="loading"
>
<el-form ref="formRef" :model="formData" label-width="120px" :rules="rules" v-loading="loading">
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">通知名称</div>
<el-form-item label="通知名称" prop="name"> {{ formData.name }} </el-form-item>
<el-form-item label="通知类型" prop="name"> {{ formData.type }} </el-form-item>
<el-form-item label="通知业务" prop="name"> {{ formData.remarks }} </el-form-item>
<el-form-item label="通知名称"> {{ formData.scene_name }} </el-form-item>
<el-form-item label="通知类型"> {{ formData.type }} </el-form-item>
<el-form-item label="通知业务"> {{ formData.scene_desc }} </el-form-item>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<div class="font-medium mb-7">短信通知</div>
<el-form-item label="开启状态" prop="smsNotice.status" required>
<el-radio-group v-model="formData.smsNotice.status">
<el-form-item label="开启状态" prop="sms_notice.status" required>
<el-radio-group v-model="formData.sms_notice.status">
<el-radio label="0">关闭</el-radio>
<el-radio label="1">开启</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="模板ID" prop="smsNotice.templateId">
<el-form-item label="模板ID" prop="sms_notice.template_id">
<div class="w-80">
<el-input
v-model="formData.smsNotice.templateId"
placeholder="请输入模板ID"
/>
<el-input v-model="formData.sms_notice.template_id" placeholder="请输入模板ID" />
</div>
</el-form-item>
<el-form-item label="短信内容" prop="smsNotice.content">
<el-form-item label="短信内容" prop="sms_notice.content">
<div class="flex-1">
<div class="w-full max-w-[320px]">
<el-input
type="textarea"
:autosize="{ minRows: 6, maxRows: 6 }"
v-model="formData.smsNotice.content"
/>
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 6 }"
v-model="formData.sms_notice.content" />
</div>
<div class="form-tips">
<div v-for="(item, index) in formData.smsNotice.tips" :key="index">
<div v-for="(item, index) in formData.sms_notice.tips" :key="index">
{{ item }}
</div>
</div>
@@ -50,7 +38,7 @@
</el-form-item>
</el-card>
</el-form>
<footer-btns>
<footer-btns v-perms="['setting:notice:save']">
<el-button type="primary" @click="handleSave">保存</el-button>
</footer-btns>
</div>
@@ -61,6 +49,7 @@ import type { FormInstance } from 'element-plus'
import feedback from '@/utils/feedback'
import { noticeDetail, setNoticeConfig } from '@/api/message'
import useMultipleTabs from '@/hooks/useMultipleTabs'
import { pick } from 'lodash'
const route = useRoute()
const router = useRouter()
@@ -68,26 +57,29 @@ const router = useRouter()
const loading = ref(false)
const formData = reactive({
id: '',
name: '',
scene_name: '',
type: '',
remarks: '',
smsNotice: {
scene_desc: '',
sms_notice: {
status: 0,
templateId: '',
template_id: '',
content: '',
tips: []
}
},
oa_notice: {},
mnp_notice: {},
system_notice: {}
})
const rules = {
'smsNotice.templateId': [
'sms_notice.template_id': [
{
required: true,
message: '请输入模板ID',
trigger: 'blur'
}
],
'smsNotice.content': [
'sms_notice.content': [
{
required: true,
message: '请输入短信内容',
@@ -106,13 +98,23 @@ const getDetails = async () => {
Object.keys(data).forEach((key) => {
//@ts-ignore
formData[key] = data[key]
formData['sms_notice'] = JSON.parse(data['sms_notice'])
formData['mnp_notice'] = JSON.parse(data['mnp_notice'])
formData['oa_notice'] = JSON.parse(data['oa_notice'])
formData['system_notice'] = JSON.parse(data['system_notice'])
})
loading.value = false
}
const handleSave = async () => {
await formRef.value?.validate()
await setNoticeConfig(formData)
const data = {
id: formData.id,
template: pick(formData, ['sms_notice', 'oa_notice', 'mnp_notice', 'system_notice'])
}
await setNoticeConfig(data)
feedback.msgSuccess('操作成功')
removeTab()
router.back()

View File

@@ -1,43 +1,43 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert
type="warning"
title="温馨提示:平台配置在各个场景下的通知发送方式和内容模板"
:closable="false"
show-icon
></el-alert>
<el-alert type="warning" title="温馨提示:平台配置在各个场景下的通知发送方式和内容模板" :closable="false" show-icon></el-alert>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-tabs v-model="tabsActive" @tab-change="getLists">
<el-tab-pane
v-for="(item, index) in tabsMap"
:key="index"
:label="item.name"
:name="item.type"
lazy
></el-tab-pane>
<el-tabs v-model="tabsActive" @tab-change="handelGetLists">
<el-tab-pane v-for="(item, index) in tabsMap" :key="index" :label="item.name" :name="item.type"
lazy></el-tab-pane>
</el-tabs>
<el-table size="large" :data="state.lists" v-loading="state.loading">
<el-table-column label="通知场景" prop="name" min-width="120" />
<el-table-column label="通知类型" prop="type" min-width="160" />
<el-table size="large" :data="pager.lists" v-loading="pager.loading">
<el-table-column label="通知场景" prop="scene_name" min-width="120" />
<el-table-column label="通知类型" prop="type_desc" min-width="160" />
<el-table-column label="短信通知" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.smsStatus == 1">开启</el-tag>
<el-tag v-if="row.sms_notice?.status == 1">开启</el-tag>
<el-tag type="danger" v-else>关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="微信模板" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.mnp_notice?.status == 1">开启</el-tag>
<el-tag type="danger" v-else>关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="微信小程序" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.oa_notice?.status == 1">开启</el-tag>
<el-tag type="danger" v-else>关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" fixed="right">
<template #default="{ row }">
<el-button v-perms="['setting:notice:detail']" type="primary" link>
<router-link
:to="{
path: getRoutePath('setting:notice:detail'),
query: {
id: row.id
}
}"
>
<router-link :to="{
path: getRoutePath('setting:notice:detail'),
query: {
id: row.id
}
}">
设置
</router-link>
</el-button>
@@ -49,6 +49,7 @@
</template>
<script lang="ts" setup name="notice">
import { noticeLists } from '@/api/message'
import { usePaging } from '@/hooks/usePaging'
import { getRoutePath } from '@/router'
enum NoticeEnums {
@@ -69,27 +70,32 @@ const tabsMap = [
]
// 列表数据
const state = reactive({
loading: false,
lists: []
const params = reactive({
recipient: tabsActive
})
const { pager, getLists } = usePaging({
fetchFun: noticeLists,
params
})
// 获取存储引擎列表数据
const getLists = async () => {
try {
state.loading = true
state.lists = await noticeLists({
recipient: tabsActive.value
const handelGetLists = () => {
getLists().then(() => {
pager.lists.forEach((item) => {
item.sms_notice = JSON.parse(item.sms_notice)
item.mnp_notice = JSON.parse(item.mnp_notice)
item.oa_notice = JSON.parse(item.oa_notice)
if (item.type == 1) {
item.type_desc = "业务通知"
} else if (item.type = 2) {
item.type_desc = "验证码"
}
})
state.loading = false
} catch (error) {
state.loading = false
}
})
}
onActivated(() => {
getLists()
handelGetLists()
})
getLists()
handelGetLists()
</script>

View File

@@ -1,13 +1,6 @@
<template>
<div class="edit-popup">
<popup
ref="popupRef"
title="设置存储"
:async="true"
width="550px"
@confirm="handleSubmit"
@close="handleClose"
>
<popup ref="popupRef" title="设置存储" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-form-item label="短信渠道">
<div>
@@ -106,7 +99,7 @@ const handleSubmit = async () => {
const getDetail = async () => {
const data = await smsDetail({
alias: formData.alias
name: formData.alias
})
for (const key in data) {
//@ts-ignore

View File

@@ -11,12 +11,7 @@
</el-table-column>
<el-table-column label="操作" min-width="120" fixed="right">
<template #default="{ row }">
<el-button
v-perms="['setting:storage:edit']"
type="primary"
link
@click="handleSet(row.alias)"
>
<el-button v-perms="['setting:sms:detail']" type="primary" link @click="handleSet(row.alias)">
设置
</el-button>
</template>

View File

@@ -27,15 +27,14 @@
}" check-strictly :default-expand-all="true" placeholder="请选择上级部门" />
</el-form-item>
<el-form-item label="岗位" prop="postId">
<el-select class="flex-1" clearable v-model="formData.postId" placeholder="请选择岗位" multiple>
<el-select class="flex-1" clearable v-model="formData.postId" placeholder="请选择岗位">
<el-option v-for="(item, index) in optionsData.post" :key="index" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="角色" prop="role">
<el-select v-model="formData.role" :disabled="isRoot" class="flex-1" clearable placeholder="请选择角色"
multiple>
<el-select v-model="formData.role" :disabled="isRoot" class="flex-1" clearable placeholder="请选择角色">
<el-option v-if="isRoot" label="系统管理员" :value="0" />
<el-option v-for="(item, index) in optionsData.role" :key="index" :label="item.name"
:value="item.id" />
@@ -197,6 +196,7 @@ const setFormData = async (row: any) => {
const data = await adminDetail({
id: row.id
})
formData.avatar = data.avatar
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//后端返回string类型做处理
@@ -207,6 +207,7 @@ const setFormData = async (row: any) => {
}
//@ts-ignore
formData[key] = data[key]
}
Number(formData.deptId) == 0 && (formData.deptId = '')
Number(formData.postId) == 0 && (formData.postId = '')

View File

@@ -0,0 +1,253 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="formData.display_name" :async="true" width="600px" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="150px" :rules="formRules">
<el-form-item label="支付方式">
<el-radio :label="formData.name" :model-value="formData.name" />
</el-form-item>
<el-form-item label="显示名称" prop="display_name">
<el-input v-model="formData.display_name" placeholder="请输入显示名称" />
</el-form-item>
<el-form-item label="显示图标" prop="image">
<div>
<material-picker :limit="1" :disabled="false" v-model="formData.icon" />
<span class="form-tips">建议尺寸200*200px</span>
</div>
</el-form-item>
<template v-if="formData.name == 'wechat'">
<el-form-item prop="config.interface_version" label="微信支付接口版本">
<div>
<el-radio-group v-model="formData.config.interface_version">
<el-radio label="v3"></el-radio>
</el-radio-group>
<div class="form-tips">暂时只支持V3版本</div>
</div>
</el-form-item>
<el-form-item label="商户类型" prop="config.merchant_type">
<div>
<el-radio-group v-model="formData.config.merchant_type">
<el-radio label="ordinary_merchant">普通商户</el-radio>
</el-radio-group>
<div class="form-tips">
暂时只支持普通商户类型服务商户类型模式暂不支持
</div>
</div>
</el-form-item>
<el-form-item label="微信支付商户号" prop="config.mch_id">
<div class="flex-1">
<el-input v-model="formData.config.mch_id" placeholder="请输入微信支付商户号" />
<div class="form-tips">微信支付商户号MCHID</div>
</div>
</el-form-item>
<el-form-item label="商户API密钥" prop="config.pay_sign_key">
<el-input v-model="formData.config.pay_sign_key" placeholder="请输入微信支付商户API密钥" />
<span class="form-tips">微信支付商户API密钥paySignKey</span>
</el-form-item>
<el-form-item label="微信支付证书" prop="config.api_client_cert">
<el-input type="textarea" rows="3" v-model="formData.config.api_client_cert"
placeholder="请输入微信支付证书" />
<span class="form-tips">
微信支付证书apiclient_cert.pem前往微信商家平台生成并黏贴至此处
</span>
</el-form-item>
<el-form-item label="微信支付证书密钥" prop="config.api_client_key">
<el-input type="textarea" rows="3" v-model="formData.config.api_client_key"
placeholder="请输入微信支付证书密钥" />
<span class="form-tips">
微信支付证书密钥apiclient_key.pem前往微信商家平台生成并黏贴至此处
</span>
</el-form-item>
<el-form-item label="支付授权目录">
<div>
<div>
<span class="mr-[20px]">{{ formData.domain }}</span>
<el-button link type="primary" v-copy="formData.domain">
复制
</el-button>
</div>
<span class="form-tips">
支付授权目录仅用于参考复制后前往微信商家平台填写
</span>
</div>
</el-form-item>
</template>
<template v-if="formData.name == 'alipay'">
<el-form-item label="模式" prop="config.mode">
<div>
<el-radio-group v-model="formData.config.mode">
<el-radio label="normal_mode">普通模式</el-radio>
</el-radio-group>
<div class="form-tips">暂时仅支持支付宝普通模式</div>
</div>
</el-form-item>
<el-form-item label="商户类型" prop="config.merchant_type">
<div>
<el-radio-group v-model="formData.config.merchant_type">
<el-radio label="ordinary_merchant">普通商户</el-radio>
</el-radio-group>
<div class="form-tips">
暂时只支持普通商户类型服务商户类型模式暂不支持
</div>
</div>
</el-form-item>
<el-form-item label="应用ID" prop="config.app_id">
<div class="flex-1">
<el-input v-model="formData.config.app_id" placeholder="请输入支付宝应用ID" />
<span class="form-tips"> 支付宝应用APP_ID </span>
</div>
</el-form-item>
<el-form-item label="应用私钥" prop="config.private_key">
<div class="flex-1">
<el-input type="textarea" rows="3" v-model="formData.config.private_key"
placeholder="请输入支付宝应用私钥" />
<span class="form-tips">支付宝应用私钥private_key </span>
</div>
</el-form-item>
<el-form-item label="支付宝公钥" prop="config.ali_public_key">
<div class="flex-1">
<el-input type="textarea" rows="3" v-model="formData.config.ali_public_key"
placeholder="请输入支付宝公钥" />
<span class="form-tips">支付宝公钥ali_public_key </span>
</div>
</el-form-item>
</template>
<el-form-item label="排序" prop="sort">
<div>
<el-input-number v-model="formData.sort" :min="0" :max="9999" />
<div class="form-tips">默认为0 数值越大越排前</div>
</div>
</el-form-item>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup>
import type { FormInstance, FormRules } from 'element-plus'
import { getPayConfig, setPayConfig } from '@/api/setting/pay'
import Popup from '@/components/popup/index.vue'
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formData = reactive({
display_name: '',
pay_way: 0,
name: '',
icon: '',
sort: 0,
remark: '',
domain: '',
config: {
interface_version: '',
merchant_type: '',
mch_id: '',
pay_sign_key: '',
api_client_cert: '',
api_client_key: '',
mode: '',
app_id: '',
private_key: '',
ali_public_key: ''
}
})
const formRules: FormRules = {
name: [
{
required: true,
message: '请输入显示名称'
}
],
'config.mch_id': [
{
required: true,
message: '请输入微信支付商户号'
}
],
'config.pay_sign_key': [
{
required: true,
message: '请输入微信支付商户API密钥'
}
],
'config.api_client_cert': [
{
required: true,
message: '请输入微信支付证书'
}
],
'config.api_client_key': [
{
required: true,
message: '请输入微信支付证书密钥'
}
],
'config.app_id': [
{
required: true,
message: '请输入支付宝应用ID'
}
],
'config.private_key': [
{
required: true,
message: '请输入支付宝应用私钥'
}
],
'config.ali_public_key': [
{
required: true,
message: '请输入支付宝公钥'
}
]
}
const handleSubmit = async () => {
await formRef.value?.validate()
await setPayConfig(formData)
popupRef.value?.close()
emit('success')
}
const open = () => {
popupRef.value?.open()
}
const setFormData = (data: Record<any, any>) => {
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await getPayConfig({
name: row.name
})
setFormData(data)
}
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@@ -0,0 +1,51 @@
<template>
<div>
<el-card class="!border-none" shadow="never">
<el-alert type="warning" title="温馨提示:设置系统支持的支付方式" :closable="false" show-icon />
</el-card>
<el-card shadow="never" class="mt-4 !border-none">
<div>
<el-table :data="payConfigList">
<el-table-column prop="name" label="支付方式" min-width="150" />
<el-table-column prop="display_name" label="显示名称" min-width="150" />
<el-table-column label="图标" min-width="150">
<template #default="{ row }">
<el-image :src="row.icon" alt="图标" style="width: 34px; height: 34px" />
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" min-width="150" />
<el-table-column label="操作" min-width="80" fixed="right">
<!-- 操作 -->
<template #default="{ row }">
<el-button v-perms="['setting:pay:config:set']" link type="primary" @click="handleEdit(row)">
配置
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" @success="getConfig" @close="showEdit = false" />
</div>
</template>
<script lang="ts" setup>
import { getPayConfigLists } from '@/api/setting/pay'
import EditPopup from './edit.vue'
const payConfigList = ref<any[]>([])
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const showEdit = ref(false)
const getConfig = async () => {
const data = await getPayConfigLists()
console.log(data);
payConfigList.value = data
}
const handleEdit = async (data: any) => {
showEdit.value = true
await nextTick()
editRef.value?.open()
editRef.value?.getDetail(data)
}
getConfig()
</script>

View File

@@ -0,0 +1,119 @@
<template>
<div>
<div>
<el-button type="primary" v-perms="['setting:pay:way:set']" @click="handelSetupPayWay">
设置支付方式
</el-button>
</div>
<el-card shadow="never" class="mt-4 !border-none" v-for="(value, scene) in payWay" :key="scene">
<div>
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.MP_WEIXIN">
微信小程序
<span class="form-tips ml-[10px]">在微信小程序中付款的场景</span>
</div>
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.OA">
微信公众号
<span class="form-tips ml-[10px]">
在微信公众号H5页面中付款的场景公众号类型一般为服务号
</span>
</div>
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.H5">
H5支付
<span class="form-tips ml-[10px]">在浏览器H5页面中付款的场景</span>
</div>
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.PC">
PC支付
<span class="form-tips ml-[10px]">在浏览器PC页面中付款的场景</span>
</div>
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.APP">
APP支付
<span class="form-tips ml-[10px]">在APP付款的场景</span>
</div>
<el-table v-if="value.length" :data="value" style="width: 100%">
<el-table-column label="图标" min-width="150">
<template #default="{ row }">
<el-image :src="row.icon" alt="图标" style="width: 34px; height: 34px" />
</template>
</el-table-column>
<el-table-column prop="display_name" label="支付方式" min-width="150" />
<el-table-column label="默认支付" min-width="150">
<template #default="{ row, $index }">
<div>
<template v-if="setupPayWay">
<el-radio v-model="row.is_default" :label="1" @change="changePayDefault($index, scene)">
设为默认
</el-radio>
</template>
<template v-else>
<el-tag v-if="row.is_default == 1">默认</el-tag>
<span v-else>-</span>
</template>
</div>
</template>
</el-table-column>
<el-table-column label="开启状态" min-width="150">
<template #default="{ row }">
<el-switch v-if="setupPayWay" v-model="row.status" :active-value="1" :inactive-value="0" />
<span v-else>
<el-tag style="font-weight: bold;" type="success" v-if="row.status == 1">开启</el-tag>
<span v-else>关闭</span>
</span>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<footer-btns v-if="setupPayWay">
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleSubmit">保存</el-button>
</footer-btns>
</div>
</template>
<script lang="ts" setup>
import { getPayWay, setPayWay } from '@/api/setting/pay'
import { cloneDeep } from 'lodash'
enum PaySceneEnum {
MP_WEIXIN = 'applet',
OA = 'oa',
H5 = 'h5',
PC = 'pc',
APP = 'app'
}
const payWay = ref<Record<string, any[]>>({})
const setupPayWay = ref(false)
let defaultPayWay = {}
const getConfig = async () => {
payWay.value = await getPayWay()
defaultPayWay = cloneDeep(payWay.value)
console.log(defaultPayWay);
}
const handelSetupPayWay = () => {
setupPayWay.value = true
}
const changePayDefault = (index: number, scene: string) => {
payWay.value[scene].forEach((item: any) => {
item.is_default = 0
})
payWay.value[scene][index].is_default = 1
}
const handleCancel = () => {
payWay.value = cloneDeep(defaultPayWay)
setupPayWay.value = false
}
const handleSubmit = async () => {
await setPayWay(payWay.value)
setupPayWay.value = false
getConfig()
}
getConfig()
</script>

View File

@@ -1,63 +1,36 @@
<template>
<div class="edit-popup">
<popup
ref="popupRef"
title="设置存储"
:async="true"
width="550px"
@confirm="handleSubmit"
@close="handleClose"
>
<popup ref="popupRef" title="设置存储" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
<el-form-item label="存储方式" prop="alias">
<el-form-item label="存储方式" prop="engine">
<div>
<el-radio model-value>{{ getStorageInfo?.name }} </el-radio>
<div class="form-tips">{{ getStorageInfo?.tips }}</div>
</div>
</el-form-item>
<div v-if="formData.alias !== 'local'">
<div v-if="formData.engine !== 'local'">
<el-form-item label=" 存储空间名称" prop="bucket">
<div class="flex-1">
<el-input
v-model="formData.bucket"
placeholder="请输入存储空间名称(Bucket)"
clearable
/>
<el-input v-model="formData.bucket" placeholder="请输入存储空间名称(Bucket)" clearable />
</div>
</el-form-item>
<el-form-item label="ACCESS_KEY" prop="accessKey">
<el-input
v-model="formData.accessKey"
placeholder="请输入ACCESS_KEY(AK)"
clearable
/>
<el-form-item label="ACCESS_KEY" prop="access_key">
<el-input v-model="formData.access_key" placeholder="请输入ACCESS_KEY(AK)" clearable />
</el-form-item>
<el-form-item label="SECRET_KEY" prop="secretKey">
<el-input
v-model="formData.secretKey"
placeholder="请输入SECRET_KEY(SK)"
clearable
/>
<el-form-item label="SECRET_KEY" prop="secret_key">
<el-input v-model="formData.secret_key" placeholder="请输入SECRET_KEY(SK)" clearable />
</el-form-item>
<el-form-item label="空间域名" prop="domain">
<div class="flex-1">
<div>
<el-input
v-model="formData.domain"
placeholder="请输入空间域名(Domain)"
clearable
/>
<el-input v-model="formData.domain" placeholder="请输入空间域名(Domain)" clearable />
</div>
<div class="form-tips">
请补全http://或https://例如https://static.cloud.com
</div>
</div>
</el-form-item>
<el-form-item
v-if="formData.alias == StorageEnum.QCLOUD"
label="REGION"
prop="region"
>
<el-form-item v-if="formData.engine == StorageEnum.QCLOUD" label="REGION" prop="region">
<el-input v-model="formData.region" placeholder="请输入region" clearable />
</el-form-item>
</div>
@@ -76,7 +49,6 @@ import { storageSetup } from '@/api/setting/storage'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { storageDetail } from '@/api/setting/storage'
import feedback from '@/utils/feedback'
enum StorageEnum {
LOCAL = 'local', // 本地
QINIU = 'qiniu', // 七牛云
@@ -88,10 +60,12 @@ const emit = defineEmits(['success'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formData = reactive({
alias: '',
name: '',
describe: '',
engine: '',
bucket: '',
accessKey: '',
secretKey: '',
access_key: '',
secret_key: '',
domain: '',
region: '', // 腾讯云需要
status: 0
@@ -128,14 +102,14 @@ const formRules = {
trigger: 'blur'
}
],
accessKey: [
access_key: [
{
required: true,
message: '请输入ACCESS_KEY',
trigger: 'blur'
}
],
secretKey: [
secret_key: [
{
required: true,
message: '请输入SECRET_KEY',
@@ -159,20 +133,21 @@ const formRules = {
}
const getStorageInfo = computed(() => {
return storageArr.find((item) => item.type == formData.alias)
return storageArr.find((item) => item.type == formData.engine)
})
const handleSubmit = async () => {
console.log(formData);
await formRef.value?.validate()
await storageSetup(formData)
feedback.msgSuccess('操作成功')
popupRef.value?.close()
emit('success')
}
const getDetail = async () => {
const data = await storageDetail({
alias: formData.alias
engine: formData.engine
})
for (const key in data) {
//@ts-ignore
@@ -181,7 +156,7 @@ const getDetail = async () => {
}
const open = (type: string) => {
formData.alias = type
formData.engine = type
popupRef.value?.open()
getDetail()
}

View File

@@ -1,27 +1,30 @@
<template>
<div class="storage">
<el-card class="!border-none" shadow="never">
<el-alert type="warning" title="温馨提示1.切换存储方式后需要将资源文件传输至新的存储端2.请勿随意切换存储方式,可能导致图片无法查看" :closable="false" show-icon></el-alert>
</el-card>
<el-card class="!border-none mt-4" shadow="never" v-loading="state.loading">
<el-table size="large" :data="state.lists">
<el-table-column label="储存方式" prop="alias" min-width="120" />
<el-table-column label="储存位置" prop="describe" min-width="160" />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.status == 1">开启</el-tag>
<el-tag type="danger" v-else>关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" fixed="right">
<template #default="{ row }">
<el-button v-perms="['setting:storage:edit']" type="primary" link @click="handleSet(row.alias)"> 设置 </el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<edit-popup ref="editRef" @success="getLists" />
</div>
<div class="storage">
<el-card class="!border-none" shadow="never">
<el-alert type="warning" title="温馨提示1.切换存储方式后需要将资源文件传输至新的存储端2.请勿随意切换存储方式,可能导致图片无法查看" :closable="false"
show-icon></el-alert>
</el-card>
<el-card class="!border-none mt-4" shadow="never" v-loading="state.loading">
<el-table size="large" :data="state.lists">
<el-table-column label="储存方式" prop="name" min-width="120" />
<el-table-column label="储存位置" prop="describe" min-width="160" />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.status == 1">开启</el-tag>
<el-tag type="danger" v-else>关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" fixed="right">
<template #default="{ row }">
<el-button v-perms="['setting:storage:edit']" type="primary" link @click="handleSet(row.engine)">
设置
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<edit-popup ref="editRef" @success="getLists" />
</div>
</template>
<script lang="ts" setup name="storage">
import { storageLists } from '@/api/setting/storage'
@@ -30,23 +33,23 @@ const editRef = shallowRef<InstanceType<typeof EditPopup>>()
// 列表数据
const state = reactive({
loading: false,
lists: []
loading: false,
lists: []
})
// 获取存储引擎列表数据
const getLists = async () => {
try {
state.loading = true
state.lists = await storageLists()
state.loading = false
} catch (error) {
state.loading = false
}
try {
state.loading = true
state.lists = await storageLists()
state.loading = false
} catch (error) {
state.loading = false
}
}
const handleSet = (alias: string) => {
editRef.value?.open(alias)
const handleSet = (engine: string) => {
editRef.value?.open(engine)
}
getLists()

View File

@@ -17,11 +17,7 @@
<el-form-item label="强制绑定手机" prop="forceBindMobile">
<div>
<el-switch
v-model="formData.forceBindMobile"
:active-value="1"
:inactive-value="0"
/>
<el-switch v-model="formData.forceBindMobile" :active-value="1" :inactive-value="0" />
<span class="mt-1 ml-2">{{
formData.forceBindMobile ? '开启' : '关闭'
}}</span>
@@ -35,11 +31,7 @@
<el-form-item label="政策协议" prop="openAgreement">
<div>
<el-switch
v-model="formData.openAgreement"
:active-value="1"
:inactive-value="0"
/>
<el-switch v-model="formData.openAgreement" :active-value="1" :inactive-value="0" />
<span class="mt-1 ml-2">
{{ formData.openAgreement ? '开启' : '关闭' }}
</span>
@@ -54,11 +46,7 @@
<el-form-item label="第三方登录" prop="openOtherAuth">
<div>
<el-switch
v-model="formData.openOtherAuth"
:active-value="1"
:inactive-value="0"
/>
<el-switch v-model="formData.openOtherAuth" :active-value="1" :inactive-value="0" />
<span class="mt-1 ml-2">
{{ formData.openOtherAuth ? '开启' : '关闭' }}
</span>
@@ -154,19 +142,14 @@ const getData = async () => {
// 保存登录注册数据
const handleSubmit = async () => {
const loginWay = formData.loginWay.join('')
const autoLoginAuth = formData.autoLoginAuth.join('')
const loginWay = formData.loginWay
const autoLoginAuth = formData.autoLoginAuth
await formRef.value?.validate()
try {
await setLogin({
...formData,
loginWay: loginWay.length == 2 ? `${loginWay[0]},${loginWay[1]}` : loginWay,
autoLoginAuth:
autoLoginAuth.length == 2
? `${autoLoginAuth[0]},${autoLoginAuth[1]}`
: autoLoginAuth
})
await setLogin(
formData
)
feedback.msgSuccess('操作成功')
getData()
} catch (error) {

View File

@@ -6,7 +6,7 @@
<el-form ref="formRef" :model="formData" label-width="120px">
<el-form-item label="用户默认头像">
<div>
<material-picker v-model="formData.defaultAvatar" :limit="1" />
<material-picker v-model="formData.default_avatar" :limit="1" />
</div>
</el-form-item>
<el-form-item>
@@ -19,7 +19,7 @@
</el-form>
</el-card>
<footer-btns v-perms="['setting:user:save']">
<footer-btns v-perms="['setting:recharge:set']">
<el-button type="primary" @click="handleSubmit">保存</el-button>
</footer-btns>
</div>
@@ -32,7 +32,7 @@ import feedback from '@/utils/feedback'
// 表单数据
const formData = reactive({
defaultAvatar: '' // 用户默认头像
default_avatar: '' as string // 用户默认头像
})
// 获取用户设置数据

View File

@@ -2,13 +2,7 @@
<template>
<div class="user-setting">
<el-card class="!border-none" shadow="never">
<el-form
ref="formRef"
class="ls-form"
:model="formData"
:rules="rules"
label-width="100px"
>
<el-form ref="formRef" class="ls-form" :model="formData" :rules="rules" label-width="100px">
<el-form-item label="头像:" prop="avatar">
<material-picker v-model="formData.avatar" :limit="1" />
</el-form-item>
@@ -27,34 +21,22 @@
<el-form-item label="当前密码:" prop="currPassword">
<div class="w-80">
<el-input
v-model.trim="formData.currPassword"
placeholder="修改密码时必填, 不修改密码时留空"
type="password"
show-password
/>
<el-input v-model.trim="formData.currPassword" placeholder="修改密码时必填, 不修改密码时留空" type="password"
show-password />
</div>
</el-form-item>
<el-form-item label="新的密码:" prop="password">
<div class="w-80">
<el-input
v-model.trim="formData.password"
placeholder="修改密码时必填, 不修改密码时留空"
type="password"
show-password
/>
<el-input v-model.trim="formData.password" placeholder="修改密码时必填, 不修改密码时留空" type="password"
show-password />
</div>
</el-form-item>
<el-form-item label="确定密码:" prop="passwordConfirm">
<div class="w-80">
<el-input
v-model.trim="formData.passwordConfirm"
placeholder="修改密码时必填, 不修改密码时留空"
type="password"
show-password
/>
<el-input v-model.trim="formData.passwordConfirm" placeholder="修改密码时必填, 不修改密码时留空" type="password"
show-password />
</div>
</el-form-item>
</el-form>

View File

@@ -2,6 +2,7 @@ package routers
import (
"likeadmin/admin/routers/common"
"likeadmin/admin/routers/finance"
"likeadmin/admin/routers/monitor"
"likeadmin/admin/routers/setting"
"likeadmin/admin/routers/system"
@@ -22,6 +23,12 @@ var InitRouters = []*core.GroupBase{
setting.ProtocolGroup,
setting.StorageGroup,
setting.WebsiteGroup,
setting.NoticeGroup,
setting.SmsGroup,
setting.RechargeGroup,
setting.UserSettingGroup,
setting.LoginSettingGroup,
setting.PayGroup,
// system
system.AdminGroup,
system.DeptGroup,
@@ -31,4 +38,9 @@ var InitRouters = []*core.GroupBase{
system.PostGroup,
system.RoleGroup,
system.UserGroup,
// finance
finance.OrderGroup,
finance.AccountLogGroup,
finance.RefundRecordGroup,
}

View File

@@ -0,0 +1,50 @@
package finance
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/finance"
"likeadmin/constant"
"likeadmin/core"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var AccountLogGroup = core.Group("/finance/account_log", newLogHandler, regLog, middleware.TokenAuth())
func newLogHandler(srv finance.IUserAccountLogService) *logHandler {
return &logHandler{srv: srv}
}
func regLog(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *logHandler) {
rg.GET("/lists", handle.list)
rg.GET("/getUmChangeType", handle.getUmChangeType)
})
}
type logHandler struct {
srv finance.IUserAccountLogService
}
// list log列表
func (h logHandler) list(c *gin.Context) {
var page request.PageReq
var listReq req.UserAccountLogListReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
return
}
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
return
}
res, err := h.srv.List(c, page, listReq)
response.CheckAndRespWithData(c, res, err)
}
// getUmChangeType 列表
func (h logHandler) getUmChangeType(c *gin.Context) {
response.OkWithData(c, constant.ChangeTypeDesc)
}

View File

@@ -0,0 +1,55 @@
package finance
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/finance"
"likeadmin/core"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var OrderGroup = core.Group("/finance/recharge", newOrderHandler, regOrder, middleware.TokenAuth())
func newOrderHandler(srv finance.IRechargeOrderService) *orderHandler {
return &orderHandler{srv: srv}
}
func regOrder(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *orderHandler) {
rg.GET("/lists", handle.list)
rg.POST("/refund", handle.refund)
})
}
type orderHandler struct {
srv finance.IRechargeOrderService
}
// list order列表
func (h orderHandler) list(c *gin.Context) {
var page request.PageReq
var listReq req.RechargeOrderListReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
return
}
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
return
}
res, err := h.srv.List(c, page, listReq)
response.CheckAndRespWithData(c, res, err)
}
// 充值订单退款
func (h orderHandler) refund(c *gin.Context) {
var refundReq req.RechargeOrderRefundReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &refundReq)) {
return
}
err := h.srv.Refund(c, refundReq)
response.CheckAndResp(c, err)
}

View File

@@ -0,0 +1,63 @@
package finance
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/finance"
"likeadmin/core"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var RefundRecordGroup = core.Group("/finance/refund", newRecordHandler, regRecord, middleware.TokenAuth())
func newRecordHandler(srv finance.IRefundRecordService, refundLogSrv finance.IRefundLogService) *recordHandler {
return &recordHandler{srv: srv, refundLogSrv: refundLogSrv}
}
func regRecord(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *recordHandler) {
rg.GET("/record/list", handle.list)
rg.GET("/record/stat", handle.stat)
rg.GET("/log", handle.refundLog)
})
}
type recordHandler struct {
srv finance.IRefundRecordService
refundLogSrv finance.IRefundLogService
}
// list record列表
func (hd recordHandler) list(c *gin.Context) {
var page request.PageReq
var listReq req.RefundRecordListReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
return
}
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
return
}
res, err := hd.srv.List(c, page, listReq)
response.CheckAndRespWithData(c, res, err)
}
// 退款统计
func (hd recordHandler) stat(c *gin.Context) {
res, err := hd.srv.Stat(c)
response.CheckAndRespWithData(c, res, err)
}
// 退款日志
func (hd recordHandler) refundLog(c *gin.Context) {
var listReq req.RefundLogListReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
return
}
res, err := hd.refundLogSrv.List(c, listReq)
response.CheckAndRespWithData(c, res, err)
}

View File

@@ -0,0 +1,41 @@
package setting
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/setting"
"likeadmin/core"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var LoginSettingGroup = core.Group("/setting/login", newLoginSettingHandler, regLoginSetting, middleware.TokenAuth())
func newLoginSettingHandler(srv setting.ISettingLoginService) *loginHandler {
return &loginHandler{srv: srv}
}
func regLoginSetting(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *loginHandler) {
rg.GET("/detail", handle.Detail)
rg.POST("/save", handle.Save)
})
}
type loginHandler struct {
srv setting.ISettingLoginService
}
func (h loginHandler) Detail(c *gin.Context) {
res, err := h.srv.Detail()
response.CheckAndRespWithData(c, res, err)
}
func (h loginHandler) Save(c *gin.Context) {
var loginReq req.SettingLoginReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &loginReq)) {
return
}
response.CheckAndResp(c, h.srv.Save(loginReq))
}

View File

@@ -0,0 +1,64 @@
package setting
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/setting"
"likeadmin/core"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var NoticeGroup = core.Group("/setting/notice", newSettingHandler, regSetting, middleware.TokenAuth())
func newSettingHandler(srv setting.INoticeSettingService) *settingHandler {
return &settingHandler{srv: srv}
}
func regSetting(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *settingHandler) {
rg.GET("/list", handle.list)
rg.GET("/detail", handle.detail)
rg.POST("/save", handle.edit)
})
}
type settingHandler struct {
srv setting.INoticeSettingService
}
// list setting列表
func (hd settingHandler) list(c *gin.Context) {
var page request.PageReq
var listReq req.NoticeSettingListReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
return
}
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
return
}
res, err := hd.srv.List(c, page, listReq)
response.CheckAndRespWithData(c, res, err)
}
// detail setting详情
func (hd settingHandler) detail(c *gin.Context) {
var detailReq req.NoticeSettingDetailReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) {
return
}
res, err := hd.srv.Detail(c, detailReq.Id)
response.CheckAndRespWithData(c, res, err)
}
// edit setting编辑
func (hd settingHandler) edit(c *gin.Context) {
var editReq req.NoticeSettingEditReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) {
return
}
response.CheckAndResp(c, hd.srv.Edit(c, editReq))
}

View File

@@ -0,0 +1,72 @@
package setting
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/setting"
"likeadmin/core"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var PayGroup = core.Group("/setting/pay", newSettingPayHandler, regSettingPay, middleware.TokenAuth())
func newSettingPayHandler(srv setting.IPaySettingService) *settingPayHandler {
return &settingPayHandler{srv: srv}
}
func regSettingPay(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *settingPayHandler) {
rg.GET("/config/lists", handle.list)
rg.GET("/config/get", handle.detail)
rg.POST("/config/set", handle.set)
rg.GET("/way/get", handle.getWay)
rg.POST("/way/set", handle.setWay)
})
}
type settingPayHandler struct {
srv setting.IPaySettingService
}
// list setting列表
func (hd settingPayHandler) list(c *gin.Context) {
res, err := hd.srv.List(c)
response.CheckAndRespWithData(c, res, err)
}
// detail setting详情
func (hd settingPayHandler) detail(c *gin.Context) {
var detailReq req.PaySettingDetailReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) {
return
}
res, err := hd.srv.Detail(c, detailReq.Name)
response.CheckAndRespWithData(c, res, err)
}
func (hd settingPayHandler) set(c *gin.Context) {
var editReq req.PaySettingEditReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) {
return
}
response.CheckAndResp(c, hd.srv.Set(c, editReq))
}
// getWay 支付场景的支付获取
func (hd settingPayHandler) getWay(c *gin.Context) {
res, err := hd.srv.GetWay(c)
response.CheckAndRespWithData(c, res, err)
}
// SetWay 支付场景的支付设置
func (hd settingPayHandler) setWay(c *gin.Context) {
var setReq map[string][]req.PaySceneSetReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &setReq)) {
return
}
err := hd.srv.SetWay(c, setReq)
response.CheckAndResp(c, err)
}

View File

@@ -0,0 +1,44 @@
package setting
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/setting"
"likeadmin/core"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var RechargeGroup = core.Group("/setting/recharge", newRechargeHandler, regRecharge, middleware.TokenAuth())
func newRechargeHandler(srv setting.IRechargeSettingService) *rechargeHandler {
return &rechargeHandler{srv: srv}
}
func regRecharge(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *rechargeHandler) {
rg.GET("/get", handle.detail)
rg.POST("/set", handle.edit)
})
}
type rechargeHandler struct {
srv setting.IRechargeSettingService
}
func (h rechargeHandler) detail(c *gin.Context) {
res, err := h.srv.Detail(c)
response.CheckAndRespWithData(c, res, err)
}
// edit setting编辑
func (h rechargeHandler) edit(c *gin.Context) {
var editReq req.RechargeSettingEditReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) {
return
}
response.CheckAndResp(c, h.srv.Edit(c, editReq))
}

View File

@@ -0,0 +1,56 @@
package setting
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/setting"
"likeadmin/core"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var SmsGroup = core.Group("/setting/sms", newSmsHandler, regSms, middleware.TokenAuth())
func newSmsHandler(srv setting.ISmsSettingService) *smsHandler {
return &smsHandler{srv: srv}
}
func regSms(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *smsHandler) {
rg.GET("/list", handle.list)
rg.GET("/detail", handle.detail)
rg.POST("/save", handle.edit)
})
}
type smsHandler struct {
srv setting.ISmsSettingService
}
// list sms列表
func (hd smsHandler) list(c *gin.Context) {
res, err := hd.srv.List()
response.CheckAndRespWithData(c, res, err)
}
// detail setting详情
func (hd smsHandler) detail(c *gin.Context) {
var detailReq req.SmsSettingDetailReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) {
return
}
res, err := hd.srv.Detail(c, detailReq.Name)
response.CheckAndRespWithData(c, res, err)
}
// edit setting编辑
func (hd smsHandler) edit(c *gin.Context) {
var editReq req.SmsSettingEditReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &editReq)) {
return
}
response.CheckAndResp(c, hd.srv.Edit(c, editReq))
}

View File

@@ -29,23 +29,23 @@ type storageHandler struct {
srv setting.ISettingStorageService
}
//list 存储列表
// list 存储列表
func (sh storageHandler) list(c *gin.Context) {
res, err := sh.srv.List()
response.CheckAndRespWithData(c, res, err)
}
//detail 存储详情
// detail 存储详情
func (sh storageHandler) detail(c *gin.Context) {
var detailReq req.SettingStorageDetailReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) {
return
}
res, err := sh.srv.Detail(detailReq.Alias)
res, err := sh.srv.Detail(detailReq.Engine)
response.CheckAndRespWithData(c, res, err)
}
//edit 存储编辑
// edit 存储编辑
func (sh storageHandler) edit(c *gin.Context) {
var editReq req.SettingStorageEditReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) {
@@ -54,7 +54,7 @@ func (sh storageHandler) edit(c *gin.Context) {
response.CheckAndResp(c, sh.srv.Edit(editReq))
}
//change 存储切换
// change 存储切换
func (sh storageHandler) change(c *gin.Context) {
var changeReq req.SettingStorageChangeReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &changeReq)) {

View File

@@ -0,0 +1,43 @@
package setting
import (
"github.com/gin-gonic/gin"
"likeadmin/admin/schemas/req"
"likeadmin/admin/service/setting"
"likeadmin/core"
"likeadmin/core/response"
"likeadmin/middleware"
"likeadmin/util"
)
var UserSettingGroup = core.Group("/setting/user", newUserHandler, regUser, middleware.TokenAuth())
func newUserHandler(srv setting.IUserService) *userHandler {
return &userHandler{srv: srv}
}
func regUser(rg *gin.RouterGroup, group *core.GroupBase) error {
return group.Reg(func(handle *userHandler) {
rg.GET("/detail", handle.detail)
rg.POST("/save", handle.edit)
})
}
type userHandler struct {
srv setting.IUserService
}
// detail user详情
func (uh userHandler) detail(c *gin.Context) {
res, err := uh.srv.Get(c)
response.CheckAndRespWithData(c, res, err)
}
// detail user详情
func (uh userHandler) edit(c *gin.Context) {
var userSetReq req.UserSetReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyJSON(c, &userSetReq)) {
return
}
response.CheckAndResp(c, uh.srv.Set(c, userSetReq))
}

View File

@@ -0,0 +1,40 @@
package req
// RechargeOrderListReq 【请填写功能名称】列表参数
type RechargeOrderListReq struct {
Sn string `form:"sn"` // 订单编号
UserInfo string `form:"user_info"` // 关键字
PayWay int32 `form:"pay_way"` // 支付方式 2-微信支付 3-支付宝支付
PayStatus int32 `form:"pay_status"` // 支付状态0-待支付1-已支付
StartTime string `form:"start_time"` // 下单开始时间
EndTime string `form:"end_time"` // 下单结束时间
}
// RechargeOrderRefundReq 退款
type RechargeOrderRefundReq struct {
RechargeId int32 `json:"recharge_id" binding:"required,gt=0"` // 订单编号
}
// UserAccountLogListReq 用户余额变动日志列表参数
type UserAccountLogListReq struct {
Sn int64 `form:"sn"` // 流水号
UserInfo int32 `form:"user_info"` // 用户编号
ChangeType int32 `form:"change_type"` // 变动类型
StartTime string `form:"start_time"` // 开始日期
EndTime string `form:"end_time"` // 结束日期
}
// RefundRecordListReq 退款记录列表参数
type RefundRecordListReq struct {
Sn string `form:"sn"` // 退款编号
OrderSn string `form:"order_sn"` // 来源单号
UserSn int64 `form:"user_sn"` // 用户编号
RefundType int32 `form:"refund_type"` // 退款类型 1-后台退款
StartTime string `form:"start_time"` // 开始日期
EndTime string `form:"end_time"` // 结束日期
}
// RefundLogListReq 退款日志列表参数
type RefundLogListReq struct {
RecordId int32 `form:"record_id"` // 充值记录id
}

View File

@@ -1,6 +1,6 @@
package req
//SettingWebsiteReq 保存网站信息参数
// SettingWebsiteReq 保存网站信息参数
type SettingWebsiteReq struct {
Name string `form:"name"` // 网站名称
Logo string `form:"logo"` // 网站图标
@@ -10,59 +10,61 @@ type SettingWebsiteReq struct {
ShopLogo string `form:"shopLogo"` // 商城Logo
}
//SettingCopyrightItemReq 保存备案信息参数
// SettingCopyrightItemReq 保存备案信息参数
type SettingCopyrightItemReq struct {
Name string `form:"name" json:"name"` // 名称
Link string `form:"link" json:"link"` // 链接
}
//SettingProtocolItem 政策通用参数
// SettingProtocolItem 政策通用参数
type SettingProtocolItem struct {
Name string `form:"name" json:"name"` // 名称
Content string `form:"content" json:"content"` // 内容
}
//SettingProtocolReq 保存政策信息参数
// SettingProtocolReq 保存政策信息参数
type SettingProtocolReq struct {
Service SettingProtocolItem `form:"service" json:"service"` // 服务协议
Privacy SettingProtocolItem `form:"privacy" json:"privacy"` // 隐私协议
}
//SettingStorageDetailReq 存储详情参数
// SettingStorageDetailReq 存储详情参数
type SettingStorageDetailReq struct {
Alias string `form:"alias" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun]
Engine string `form:"engine" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun]
}
//SettingStorageEditReq 存储编辑参数
// SettingStorageEditReq 存储编辑参数
type SettingStorageEditReq struct {
Alias string `form:"alias" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun]
Status int `form:"status" binding:"oneof=0 1"` // 状态: 0/1
Bucket string `form:"bucket"` // 存储空间名
SecretKey string `form:"secretKey"` // SK
AccessKey string `form:"accessKey"` // AK
Domain string `form:"domain"` // 访问域名
Region string `form:"region"` // 地区,腾讯存储特有
Engine string `json:"engine" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun]
Name string `json:"name" binding:"required"` // 名称
Describe string `json:"describe" binding:"required"` // 描述
Bucket string `json:"bucket,omitempty"` // 存储空间名
SecretKey string `json:"secret_key,omitempty"` // SK
AccessKey string `json:"access_key,omitempty"` // AK
Domain string `json:"domain,omitempty"` // 访问域名
Region string `json:"region,omitempty"` // 地区,腾讯存储特有
Status int32 `json:"status,omitempty"` // 状态
}
//SettingStorageChangeReq 存储切换参数
// SettingStorageChangeReq 存储切换参数
type SettingStorageChangeReq struct {
Alias string `form:"alias" binding:"required,oneof=local qiniu qcloud aliyun"` // 别名: [local,qiniu,qcloud,aliyun]
Status int `form:"status" binding:"oneof=0 1"` // 状态: 0/1
}
//SettingDictTypeListReq 字典类型新增参数
// SettingDictTypeListReq 字典类型新增参数
type SettingDictTypeListReq struct {
DictName string `form:"dictName" binding:"max=200"` // 字典名称
DictType string `form:"dictType" binding:"max=200"` // 字典类型
DictStatus int8 `form:"dictStatus,default=-1" binding:"oneof=-1 0 1"` // 字典状态: 0/1
}
//SettingDictTypeDetailReq 字典类型详情参数
// SettingDictTypeDetailReq 字典类型详情参数
type SettingDictTypeDetailReq struct {
ID uint `form:"id" binding:"required,gt=0"` // 主键
}
//SettingDictTypeAddReq 字典类型新增参数
// SettingDictTypeAddReq 字典类型新增参数
type SettingDictTypeAddReq struct {
DictName string `form:"dictName" binding:"required,max=200"` // 字典名称
DictType string `form:"dictType" binding:"required,max=200"` // 字典类型
@@ -70,7 +72,7 @@ type SettingDictTypeAddReq struct {
DictStatus int8 `form:"dictStatus" binding:"required,oneof=0 1"` // 字典状态: 0/1
}
//SettingDictTypeEditReq 字典类型编辑参数
// SettingDictTypeEditReq 字典类型编辑参数
type SettingDictTypeEditReq struct {
ID uint `form:"id" binding:"required,gt=0"` // 主键
DictName string `form:"dictName" binding:"required,max=200"` // 字典名称
@@ -79,12 +81,12 @@ type SettingDictTypeEditReq struct {
DictStatus int8 `form:"dictStatus" binding:"required,oneof=0 1"` // 字典状态: 0/1
}
//SettingDictTypeDelReq 字典类型删除参数
// SettingDictTypeDelReq 字典类型删除参数
type SettingDictTypeDelReq struct {
Ids []uint `form:"ids" binding:"required"` // 主键列表
}
//SettingDictDataListReq 字典数据列表参数
// SettingDictDataListReq 字典数据列表参数
type SettingDictDataListReq struct {
DictType string `form:"dictType" binding:"max=200"` // 字典类型
Name string `form:"name" binding:"max=100"` // 键
@@ -92,12 +94,12 @@ type SettingDictDataListReq struct {
Status int8 `form:"status,default=-1" binding:"oneof=-1 0 1"` // 状态: 0=停用,1=启用
}
//SettingDictDataDetailReq 字典数据详情参数
// SettingDictDataDetailReq 字典数据详情参数
type SettingDictDataDetailReq struct {
ID uint `form:"id" binding:"required,gt=0"` // 主键
}
//SettingDictDataAddReq 字典数据新增参数
// SettingDictDataAddReq 字典数据新增参数
type SettingDictDataAddReq struct {
TypeId uint `form:"typeId" binding:"required,gt=0"` // 类型
Name string `form:"name" binding:"required,max=100"` // 键
@@ -107,7 +109,7 @@ type SettingDictDataAddReq struct {
Status int8 `form:"status,default=-1" binding:"oneof=-1 0 1"` // 状态: 0=停用,1=启用
}
//SettingDictDataEditReq 字典数据编辑参数
// SettingDictDataEditReq 字典数据编辑参数
type SettingDictDataEditReq struct {
ID uint `form:"id" binding:"required,gt=0"` // 主键
TypeId uint `form:"typeId" binding:"required,gte=0"` // 类型
@@ -118,7 +120,110 @@ type SettingDictDataEditReq struct {
Status int8 `form:"status,default=-1" binding:"oneof=-1 0 1"` // 状态: 0=停用,1=启用
}
//SettingDictDataDelReq 字典数据删除参数
// SettingDictDataDelReq 字典数据删除参数
type SettingDictDataDelReq struct {
Ids []uint `form:"ids" binding:"required"` // 主键列表
}
// NoticeSettingListReq 通知列表
type NoticeSettingListReq struct {
Recipient int32 `form:"recipient"` // 接收者 1-用户 2-平台
}
// NoticeSettingDetailReq 通知设置详情参数
type NoticeSettingDetailReq struct {
Id int32 `form:"id" binding:"required,gt=0"` //
}
// NoticeSettingEditReq 通知设置新增参数
type NoticeSettingEditReq struct {
Id int32 `json:"id"` //
Template struct {
SmsNotice struct {
Content string `json:"content"`
IsShow string `json:"is_show"`
Status string `json:"status"`
TemplateId string `json:"template_id"`
Tips []string `json:"tips"`
Type string `json:"type"`
} `json:"sms_notice"`
} `json:"template"`
}
// SmsSettingDetailReq 短信设置详情参数
type SmsSettingDetailReq struct {
Name string `form:"name" binding:"required"` //
}
type SmsSettingEditReq struct {
Name string `json:"name" binding:"required"`
Alias string `json:"alias" binding:"required"`
Sign string `json:"sign" `
AppKey string `json:"appKey" `
AppId string `json:"appId"`
SecretKey string `json:"secretKey" `
SecretId string `json:"secretId" `
Status int32 `json:"status" `
}
type StorageSettingEditReq struct {
Name string `json:"name" binding:"required"`
Engine string `json:"engine" binding:"required"`
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey" `
Bucket string `json:"bucket" `
Domain string `json:"domain" `
Region string `json:"region" `
Status int32 `json:"status" `
}
// 充值配置
type RechargeSettingEditReq struct {
Status int32 `json:"status" binding:""`
MinAmount int32 `json:"min_amount" binding:""`
}
// UserSetReq 设置用户默认头像
type UserSetReq struct {
DefaultAvatar string `json:"default_avatar" binding:"required"` // 默认头像
}
type SettingLoginReq struct {
LoginWay []int32 `json:"loginWay" binding:"required"`
ForceBindMobile int32 `json:"forceBindMobile" binding:""`
OpenAgreement int32 `json:"openAgreement" binding:""`
OpenOtherAuth int32 `json:"openOtherAuth" binding:""`
AutoLoginAuth []int32 `json:"autoLoginAuth" binding:""`
}
type PaySettingEditReq struct {
Name string `json:"name" binding:"required"`
DisplayName string `json:"display_name" binding:"required"`
Icon string `json:"icon" binding:"required"`
Remark string `json:"remark"`
Domain string `json:"domain"`
Sort int32 `json:"sort"`
Config struct {
ApiClientCert string `json:"api_client_cert,omitempty"` //微信支付配置
ApiClientKey string `json:"api_client_key,omitempty"` //微信支付配置
InterfaceVersion string `json:"interface_version,omitempty"` //微信支付配置
MchId string `json:"mch_id,omitempty"` //微信支付配置
MerchantType string `json:"merchant_type,omitempty"` //微信支付配置 支付宝配置 共用
PaySignKey string `json:"pay_sign_key,omitempty"` //微信支付配置
AliPublicKey string `json:"ali_public_key,omitempty"` //支付宝配置
AppId string `json:"app_id,omitempty"` //支付宝配置
Mode string `json:"mode,omitempty"` //支付宝配置
PrivateKey string `json:"private_key,omitempty"` //支付宝配置
} `json:"config,omitempty" `
}
// PaySettingDetailReq 短信设置详情参数
type PaySettingDetailReq struct {
Name string `form:"name" binding:"required"` //
}
type PaySceneSetReq struct {
Scene string `json:"scene" binding:"required"`
IsDefault int32 `json:"is_default"` // 1 默认
Status int32 `json:"status" ` // 1 开启 0 关闭
PaymentName string `json:"payment_name" `
}

View File

@@ -0,0 +1,105 @@
package resp
import "likeadmin/core"
// RechargeOrderResp 【请填写功能名称】返回信息
type RechargeOrderResp struct {
ID int32 `json:"id" structs:"id"` // id
Sn string `json:"sn" structs:"sn"` // 订单编号
UserID int32 `json:"user_id" structs:"user_id"` // 用户id
UserSn int32 `json:"user_sn" structs:"user_sn"` // 用户编号-冗余字段
Mobile string `json:"mobile" structs:"mobile"` // 用户手机号码-冗余字段
PaySn string `json:"pay_sn" structs:"pay_sn"` // 支付编号-冗余字段,针对微信同一主体不同客户端支付需用不同订单号预留。
PayWay int32 `json:"pay_way" structs:"pay_way"` // 支付方式 2-微信支付 3-支付宝支付
PayStatus int32 `json:"pay_status" structs:"pay_status"` // 支付状态0-待支付1-已支付
PayTime core.TsTime `json:"pay_time" structs:"pay_time"` // 支付时间
OrderAmount float64 `json:"order_amount" structs:"order_amount"` // 充值金额
OrderTerminal int32 `json:"order_terminal" structs:"order_terminal"` // 终端
TransactionId string `json:"transaction_id" structs:"transaction_id"` // 第三方平台交易流水号
RefundStatus int32 `json:"refund_status" structs:"refund_status"` // 退款状态 0-未退款 1-已退款
CreateTime core.TsTime `json:"create_time" structs:"create_time"` // 创建时间
UpdateTime core.TsTime `json:"update_time" structs:"update_time"` // 更新时间
User struct {
ID int32 `json:"id" structs:"id"`
Avatar string `json:"avatar" structs:"avatar"`
} `json:"user" structs:"user"`
}
// UserAccountLogResp 用户余额变动日志返回信息
type UserAccountLogResp struct {
ID int32 `json:"id" structs:"id"` //
Sn int32 `json:"sn" structs:"sn"` // 流水号
UserID int32 `json:"user_id" structs:"user_id"` // 用户id
ChangeObject int32 `json:"change_object" structs:"change_object"` // 变动对象
ChangeType int32 `json:"change_type" structs:"change_type"` // 变动类型
Action int32 `json:"action" structs:"action"` // 动作 1-增加 2-减少
ChangeAmount int32 `json:"change_amount" structs:"change_amount"` // 变动数量
LeftAmount int32 `json:"left_amount" structs:"left_amount"` // 变动后数量
ChangeTypeDesc string `json:"change_type_desc" ` // 变动类型描述
SourceSn string `json:"source_sn" structs:"source_sn"` // 关联单号
Remark string `json:"remark" structs:"remark"` // 备注
Extra string `json:"extra" structs:"extra"` // 预留扩展字段
CreateTime core.TsTime `json:"create_time" structs:"create_time"` // 创建时间
UpdateTime core.TsTime `json:"update_time" structs:"update_time"` // 更新时间
User struct {
ID int32 `json:"id" structs:"id"`
Sn int64 `json:"sn,omitempty" structs:"sn"`
Avatar string `json:"avatar,omitempty" structs:"avatar"`
Nickname string `json:"nickname,omitempty" structs:"nickname"`
Mobile string `json:"mobile,omitempty" structs:"mobile"`
} `json:"user" structs:"user"`
}
// RefundRecordResp 退款记录返回信息
type RefundRecordResp struct {
ID int32 `json:"id" structs:"id"` // id
Sn string `json:"sn" structs:"sn"` // 退款编号
UserID int32 `json:"user_id" structs:"user_id"` // 关联用户
OrderID int32 `json:"order_id" structs:"order_id"` // 来源订单id
OrderSn string `json:"order_sn" structs:"order_sn"` // 来源单号
OrderType string `json:"order_type" structs:"order_type"` // 订单来源 order-商品订单 recharge-充值订单
OrderAmount int32 `json:"order_amount" structs:"order_amount"` // 订单总的应付款金额,冗余字段
RefundAmount int32 `json:"refund_amount" structs:"refund_amount"` // 本次退款金额
TransactionId string `json:"transaction_id" structs:"transaction_id"` // 第三方平台交易流水号
RefundWay int32 `json:"refund_way" structs:"refund_way"` // 退款方式 1-线上退款 2-线下退款
RefundType int32 `json:"refund_type" structs:"refund_type"` // 退款类型 1-后台退款
RefundTypeText string `json:"refund_type_text"` // 退款类型 1-后台退款
RefundStatus int32 `json:"refund_status" structs:"refund_status"` // 退款状态0退款中1退款成功2退款失败
RefundStatusText string `json:"refund_status_text" ` // 退款状态0退款中1退款成功2退款失败
CreateTime core.TsTime `json:"create_time" structs:"create_time"` // 创建时间
UpdateTime core.TsTime `json:"update_time" structs:"update_time"` // 更新时间
User struct {
ID int32 `json:"id" structs:"id"`
Sn int64 `json:"sn,omitempty" structs:"sn"`
Avatar string `json:"avatar,omitempty" structs:"avatar"`
Nickname string `json:"nickname,omitempty" structs:"nickname"`
Mobile string `json:"mobile,omitempty" structs:"mobile"`
} `json:"user" structs:"user"`
}
type Stat struct {
Total float32 `json:"total" structs:"total"`
Ing float32 `json:"ing" structs:"ing"`
Success float32 `json:"success" structs:"success"`
Error float32 `json:"error" structs:"error"`
}
// RefundLogResp 退款日志返回信息
type RefundLogResp struct {
ID int32 `json:"id" structs:"id"` // id
Sn string `json:"sn" structs:"sn"` // 编号
RecordID int32 `json:"record_id" structs:"record_id"` // 充值记录id
UserID int32 `json:"user_id" structs:"user_id"` // 关联用户
HandleID int32 `json:"handle_id" structs:"handle_id"` // 处理人id管理员id
OrderAmount int32 `json:"order_amount" structs:"order_amount"` // 订单总的应付款金额,冗余字段
RefundAmount int32 `json:"refund_amount" structs:"refund_amount"` // 本次退款金额
RefundStatus int32 `json:"refund_status" structs:"refund_status"` // 退款状态0退款中1退款成功2退款失败
RefundStatusText string `json:"refund_status_text"` // 退款状态0退款中1退款成功2退款失败
RefundMsg string `json:"refund_msg" structs:"refund_msg"` // 退款信息
CreateTime core.TsTime `json:"create_time" structs:"create_time"` // 创建时间
UpdateTime core.TsTime `json:"update_time" structs:"update_time"` // 更新时间
Admin struct {
ID int32 `json:"id" structs:"id"`
Nickname string `json:"nickname" structs:"nickname"`
} `json:"admin" structs:"admin"`
}

View File

@@ -2,7 +2,7 @@ package resp
import "likeadmin/core"
//SettingDictTypeResp 字典类型返回信息
// SettingDictTypeResp 字典类型返回信息
type SettingDictTypeResp struct {
ID uint `json:"id" structs:"id"` // 主键
DictName string `json:"dictName" structs:"dictName"` // 字典名称
@@ -13,7 +13,7 @@ type SettingDictTypeResp struct {
UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间
}
//SettingDictDataResp 字典数据返回信息
// SettingDictDataResp 字典数据返回信息
type SettingDictDataResp struct {
ID uint `json:"id" structs:"id"` // 主键
TypeId uint `json:"typeId" structs:"typeId"` // 类型
@@ -25,3 +25,90 @@ type SettingDictDataResp struct {
CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间
UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间
}
// NoticeSettingResp 通知设置返回信息
type NoticeSettingResp struct {
ID int32 `json:"id" structs:"id"` //
SceneID int32 `json:"scene_id" structs:"scene_id"` // 场景id
SceneName string `json:"scene_name" structs:"scene_name"` // 场景名称
SceneDesc string `json:"scene_desc" structs:"scene_desc"` // 场景描述
Recipient int32 `json:"recipient" structs:"recipient"` // 接收者 1-用户 2-平台
Type int32 `json:"type" structs:"type"` // 通知类型: 1-业务通知 2-验证码
SystemNotice string `json:"system_notice" structs:"system_notice"` // 系统通知设置
SmsNotice string `json:"sms_notice" structs:"sms_notice"` // 短信通知设置
OaNotice string `json:"oa_notice" structs:"oa_notice"` // 公众号通知设置
MnpNotice string `json:"mnp_notice" structs:"mnp_notice"` // 小程序通知设置
Support string `json:"support" structs:"support"` // 支持的发送类型 1-系统通知 2-短信通知 3-微信模板消息 4-小程序提醒
UpdateTime core.TsTime `json:"update_time" structs:"update_time"` // 更新时间
}
type SmsSettingResp struct {
Name string `json:"name" structs:"name"`
Alias string `json:"alias" structs:"alias"`
Sign string `json:"sign" structs:"sign"`
AppKey string `json:"appKey" structs:"appKey"`
AppId string `json:"appId" structs:"appId"`
SecretKey string `json:"secretKey" structs:"secretKey"`
SecretId string `json:"secretId" structs:"secretId"`
Status int32 `json:"status" structs:"status"`
}
type StorageSettingResp struct {
Name string `json:"name" structs:"name"`
Engine string `json:"engine" structs:"engine"`
Describe string `json:"describe" structs:"describe"`
Bucket string `json:"bucket,omitempty" structs:"bucket"`
AccessKey string `json:"access_key,omitempty" structs:"access_key"`
Domain string `json:"domain,omitempty" structs:"domain"`
SecretKey string `json:"secret_key,omitempty" structs:"secret_key"`
Region string `json:"region,omitempty" structs:"region"`
Status int32 `json:"status,omitempty" structs:"status"`
}
type RechargeSettingResp struct {
Status int `json:"status" structs:"status"`
MinAmount int `json:"min_amount" structs:"min_amount"`
}
// UserSetResp 设置用户默认头像
type UserSetResp struct {
DefaultAvatar string `json:"default_avatar" structs:"defaultAvatar"` // 默认头像
}
type SettingLoginResp struct {
LoginWay []int32 `json:"loginWay" structs:"loginWay"`
ForceBindMobile int32 `json:"forceBindMobile" structs:"forceBindMobile"`
OpenAgreement int32 `json:"openAgreement" structs:"openAgreement"`
OpenOtherAuth int32 `json:"openOtherAuth" structs:"openOtherAuth"`
AutoLoginAuth []int32 `json:"autoLoginAuth" structs:"autoLoginAuth"`
}
type PaySettingResp struct {
Name string `json:"name" structs:"name"`
DisplayName string `json:"display_name" structs:"display_name"`
Icon string `json:"icon" structs:"icon"`
Remark string `json:"remark" structs:"remark"`
Domain string `json:"domain" structs:"domain"`
Sort int32 `json:"sort" structs:"sort"`
Config struct {
ApiClientCert string `json:"api_client_cert,omitempty" structs:"api_client_cert"` //微信支付配置
ApiClientKey string `json:"api_client_key,omitempty" structs:"api_client_key"` //微信支付配置
InterfaceVersion string `json:"interface_version,omitempty" structs:"interface_version"` //微信支付配置
MchId string `json:"mch_id,omitempty" structs:"mch_id"` //微信支付配置
MerchantType string `json:"merchant_type,omitempty" structs:"merchant_type"` //微信支付配置 支付宝配置
PaySignKey string `json:"pay_sign_key,omitempty" structs:"pay_sign_key"` //微信支付配置
AliPublicKey string `json:"ali_public_key,omitempty" structs:"ali_public_key"` //支付宝配置
AppId string `json:"app_id,omitempty" structs:"app_id"` //支付宝配置
Mode string `json:"mode,omitempty" structs:"mode"` //支付宝配置
PrivateKey string `json:"private_key,omitempty" structs:"private_key"` //支付宝配置
} `json:"config,omitempty" structs:"config"`
}
type PaySceneResp struct {
Scene string `json:"scene" structs:"scene"`
IsDefault int32 `json:"is_default" structs:"is_default"` // 1 默认
Status int32 `json:"status" structs:"status"` // 1 开启 0 关闭
PaymentName string `json:"payment_name" structs:"payment_name"`
DisplayName string `json:"display_name" structs:"display_name"`
Icon string `json:"icon" structs:"icon"`
}

View File

@@ -152,22 +152,21 @@ type SystemLogLoginResp struct {
// UserResp 用户返回信息
type UserResp struct {
Id int32 `json:"id" structs:"id"` // 主键
Sn int32 `json:"sn" structs:"sn"` // 编号
Avatar string `json:"avatar" structs:"avatar"` // 头像
RealName string `json:"realName" structs:"realName"` // 真实姓名
Nickname string `json:"nickname" structs:"nickname"` // 用户昵称
Account string `json:"account" structs:"account"` // 用户账号
Password string `json:"password" structs:"password"` // 用户密码
Mobile string `json:"mobile" structs:"mobile"` // 用户电话
Sex int32 `json:"sex" structs:"sex"` // 用户性别: [1=男, 2=女]
Channel int32 `json:"channel" structs:"channel"` // 注册渠道: [1-微信小程序 2-微信公众号 3-手机H5 4-电脑PC 5-苹果APP 6-安卓APP]
IsDisable int32 `json:"isDisable" structs:"isDisable"` // 是否禁用: [0=否, 1=是]
LoginIp string `json:"loginIp" structs:"loginIp"` // 最后登录IP
LoginTime string `json:"loginTime" structs:"loginTime"` // 最后登录时间
IsNewUser int `json:"isNewUser" structs:"isNewUser"` // 是否是新注册用户: [1-是, 0-否]
UserMoney float64 `json:"userMoney" structs:"userMoney"` // 用户余额
TotalRechargeAmount float64 `json:"totalRechargeAmount" structs:"totalRechargeAmount"` // 累计充值
CreateTime core.TsTime `json:"createTime" structs:"createTime"` // 创建时间
UpdateTime core.TsTime `json:"updateTime" structs:"updateTime"` // 更新时间
ID int32 `json:"id" structs:"id"` // 主键
Sn int32 `json:"sn" structs:"sn"` // 编号
Avatar string `json:"avatar" structs:"avatar"` // 头像
RealName string `json:"real_name" structs:"real_name"` // 真实姓名
Nickname string `json:"nickname" structs:"nickname"` // 用户昵称
Account string `json:"account" structs:"account"` // 用户账号
Mobile string `json:"mobile" structs:"mobile"` // 用户电话
Sex int32 `json:"sex" structs:"sex"` // 用户性别: [1=男, 2=女]
Channel int32 `json:"channel" structs:"channel"` // 注册渠道: [1-微信小程序 2-微信公众号 3-手机H5 4-电脑PC 5-苹果APP 6-安卓APP]
IsDisable int32 `json:"is_disable" structs:"is_disable"` // 是否禁用: [0=否, 1=是]
LoginIp string `json:"login_ip" structs:"login_ip"` // 最后登录IP
LoginTime core.TsTime `json:"login_time" structs:"login_time"` // 最后登录时间
IsNewUser int32 `json:"is_new_user" structs:"is_new_user"` // 是否是新注册用户: [1-是, 0-否]
UserMoney int32 `json:"user_money" structs:"user_money"` // 用户余额
TotalRechargeAmount int32 `json:"total_recharge_amount" structs:"total_recharge_amount"` // 累计充值
CreateTime core.TsTime `json:"create_time" structs:"create_time"` // 创建时间
UpdateTime core.TsTime `json:"update_time" structs:"update_time"` // 更新时间
}

View File

@@ -2,6 +2,7 @@ package service
import (
"likeadmin/admin/service/common"
"likeadmin/admin/service/finance"
"likeadmin/admin/service/setting"
"likeadmin/admin/service/system"
)
@@ -18,6 +19,12 @@ var InitFunctions = []interface{}{
setting.NewSettingProtocolService,
setting.NewSettingStorageService,
setting.NewSettingWebsiteService,
setting.NewNoticeSettingService,
setting.NewSmsSettingService,
setting.NewRechargeSettingService,
setting.NewUserService,
setting.NewSettingLoginService,
setting.NewPaySettingService,
// system
system.NewSystemAuthAdminService,
system.NewSystemAuthDeptService,
@@ -28,4 +35,10 @@ var InitFunctions = []interface{}{
system.NewSystemLoginService,
system.NewSystemLogsServer,
system.NewUserService,
// finance
finance.NewRechargeOrderService,
finance.NewUserAccountLogService,
finance.NewRefundRecordService,
finance.NewRefundLogService,
}

View File

@@ -0,0 +1,88 @@
package finance
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/constant"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/util"
)
type IUserAccountLogService interface {
List(c *gin.Context, page request.PageReq, listReq req.UserAccountLogListReq) (res response.PageResp, e error)
}
// NewUserAccountLogService 初始化
func NewUserAccountLogService(db *gorm.DB, dao *dao.Query) IUserAccountLogService {
return &userAccountLogService{db: db, dao: dao}
}
// userAccountLogService 用户余额变动日志服务实现类
type userAccountLogService struct {
db *gorm.DB
dao *dao.Query
}
// List 用户余额变动日志列表
func (srv userAccountLogService) List(c *gin.Context, page request.PageReq, listReq req.UserAccountLogListReq) (res response.PageResp, e error) {
// 分页信息
limit := page.PageSize
offset := page.PageSize * (page.PageNo - 1)
m := srv.dao.UserAccountLog
u := srv.dao.User
q := m.WithContext(c)
// 查询
if listReq.Sn > 0 {
q = q.Where(m.Sn.Eq(listReq.Sn))
}
if listReq.ChangeType > 0 {
q = q.Where(m.ChangeType.Eq(listReq.ChangeType))
}
// 时间范围查询
if listReq.StartTime != "" && listReq.EndTime != "" {
startTime, err := util.DateToTimestamp(listReq.StartTime)
if e = response.CheckErr(err, "DateToTimestamp err"); e != nil {
return
}
endTime, err := util.DateToTimestamp(listReq.EndTime)
if e = response.CheckErr(err, "DateToTimestamp err"); e != nil {
return
}
q = q.Where(m.CreateTime.Gt(int32(startTime)), m.CreateTime.Lt(int32(endTime)))
}
// 总数
var count int64
count, err := q.Count()
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
// 数据
objs, err := q.Preload(m.User.Select(u.ID, u.Sn, u.Avatar, u.Nickname, u.Mobile)).Limit(limit).Offset(offset).Order(m.ID.Desc()).Find()
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
var resps []resp.UserAccountLogResp
response.Copy(&resps, objs)
for i, resp := range resps {
resps[i].User.Avatar = util.UrlUtil.ToAbsoluteUrl(resp.User.Avatar)
resps[i].ChangeTypeDesc = constant.GetUserMoneyChangeTypeDesc(resp.ChangeType)
}
return response.PageResp{
PageNo: page.PageNo,
PageSize: page.PageSize,
Count: count,
Lists: resps,
}, nil
}

View File

@@ -0,0 +1,218 @@
package finance
import (
"github.com/gin-gonic/gin"
"github.com/shopspring/decimal"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/config"
"likeadmin/constant"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/model"
"likeadmin/util"
"strconv"
"time"
)
type IRechargeOrderService interface {
List(c *gin.Context, page request.PageReq, listReq req.RechargeOrderListReq) (res response.PageResp, e error)
Refund(c *gin.Context, req req.RechargeOrderRefundReq) (e error)
}
// NewRechargeOrderService 初始化
func NewRechargeOrderService(db *gorm.DB, dao *dao.Query, refundSrv IRefundRecordService, refundLogSrv IRefundLogService) IRechargeOrderService {
return &rechargeOrderService{db: db, dao: dao, refundSrv: refundSrv, refundLogSrv: refundLogSrv}
}
// rechargeOrderService 【请填写功能名称】服务实现类
type rechargeOrderService struct {
db *gorm.DB
dao *dao.Query
refundSrv IRefundRecordService
refundLogSrv IRefundLogService
}
// List 【请填写功能名称】列表
func (srv rechargeOrderService) List(c *gin.Context, page request.PageReq, listReq req.RechargeOrderListReq) (res response.PageResp, e error) {
// 分页信息
limit := page.PageSize
offset := page.PageSize * (page.PageNo - 1)
// 总数
var count int64
m := srv.dao.RechargeOrder
u := srv.dao.User
q := m.WithContext(c)
// 用户编号和手机号查询
if listReq.UserInfo != "" {
userInfo, _ := strconv.ParseInt(listReq.UserInfo, 10, 32)
q = q.Where(q.Where(m.UserSn.Eq(int32(userInfo))).
Or(m.Mobile.Eq(listReq.UserInfo)))
}
// 订单号查询
if listReq.Sn != "" {
q = q.Where(m.Sn.Eq(listReq.Sn))
}
// 支付方式
if listReq.PayWay > 0 {
q = q.Where(m.PayWay.Eq(listReq.PayWay))
}
// 支付状态
if listReq.PayStatus > 0 {
q = q.Where(m.PayStatus.Eq(listReq.PayStatus))
}
// 时间范围查询
if listReq.StartTime != "" && listReq.EndTime != "" {
startTime, err := util.DateToTimestamp(listReq.StartTime)
if e = response.CheckErr(err, "DateToTimestamp err"); e != nil {
return
}
endTime, err := util.DateToTimestamp(listReq.EndTime)
if e = response.CheckErr(err, "DateToTimestamp err"); e != nil {
return
}
q = q.Where(m.CreateTime.Gt(int32(startTime)), m.CreateTime.Lt(int32(endTime)))
}
count, err := q.Count()
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
var lists []resp.RechargeOrderResp
objs, err := q.Preload(m.User.Select(u.ID, u.Avatar)).Limit(limit).Offset(offset).Find()
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
for _, obj := range objs {
obj.User.Avatar = util.UrlUtil.ToAbsoluteUrl(obj.User.Avatar)
}
response.Copy(&lists, objs)
return response.PageResp{
PageNo: page.PageNo,
PageSize: page.PageSize,
Count: count,
Lists: lists,
}, nil
}
func (srv rechargeOrderService) Refund(c *gin.Context, refundReq req.RechargeOrderRefundReq) (err error) {
tx := srv.dao.Begin()
m := srv.dao.RechargeOrder
u := srv.dao.User
q := m.WithContext(c)
defer func() {
if recover() != nil || err != nil {
_ = tx.Rollback()
}
}()
order, e := q.Where(m.ID.Eq(refundReq.RechargeId)).Preload(m.User.Select(u.ID, u.UserMoney, u.Sn)).Take()
// 校验
if err = response.CheckErrDBNotRecord(e, "数据不存在!"); err != nil {
return
}
if err = response.CheckErr(e, "Refund First err"); err != nil {
return
}
if order.PayStatus != constant.PayWayStatusPaid {
tx.Rollback()
return response.Failed.Make("订单未支付,不能退款")
}
if order.User.UserMoney < order.OrderAmount {
tx.Rollback()
return response.Failed.Make("用户余额小于订单金额,不能退款")
}
if order.RefundStatus == constant.RefundStatusRefunded {
tx.Rollback()
return response.Failed.Make("已退款订单不能重复退款")
}
// 给余额和充值总数减去金额
_, e = tx.User.WithContext(c).Where(u.ID.Eq(order.User.ID)).UpdateSimple(u.UserMoney.Sub(order.OrderAmount))
if err = response.CheckErr(e, "扣除用户余额失败"); err != nil {
return
}
// 设置充值订单退款状态为已退款 防止重复退款
_, e = tx.RechargeOrder.WithContext(c).Where(m.ID.Eq(order.ID)).UpdateSimple(m.RefundStatus.Value(constant.RefundStatusRefunded))
if err = response.CheckErr(e, "设置充值订单退款状态为已退款时失败"); err != nil {
return
}
UserMoney := decimal.NewFromFloat(order.User.UserMoney).Round(2)
Num := decimal.NewFromFloat(order.OrderAmount).Round(2)
leftAmount, _ := UserMoney.Sub(Num).Float64()
// 写入余额变化日志
e = tx.WithContext(c).UserAccountLog.Create(&model.UserAccountLog{
Sn: order.User.Sn,
UserID: order.User.ID,
ChangeObject: constant.GetChangeObject(constant.UmDecRechargeRefund),
ChangeType: constant.UmDecRechargeRefund,
Action: constant.DEC,
ChangeAmount: order.OrderAmount,
LeftAmount: leftAmount,
SourceSn: order.Sn, // 关联单号
CreateTime: int32(time.Now().Unix()),
})
if err = response.CheckErr(e, "UserAccountLog Create err"); err != nil {
return
}
// 写入退款记录
refundRecord := &model.RefundRecord{
Sn: srv.refundSrv.GenerateSN("RF", 10),
UserID: order.UserID,
UserSn: order.User.Sn,
OrderID: order.ID,
OrderSn: order.Sn,
OrderType: constant.OrderTypeRecharge,
OrderAmount: order.OrderAmount,
RefundAmount: order.OrderAmount,
TransactionID: order.TransactionID,
RefundWay: constant.RefundWayOnline,
RefundType: constant.RefundTypeBack,
RefundStatus: constant.RefundStatusRefunding,
CreateTime: int32(time.Now().Unix()),
}
e = tx.WithContext(c).RefundRecord.Create(refundRecord)
if err = response.CheckErr(e, "RefundRecord Create err"); err != nil {
return
}
// 获取管理员Id
adminId, _ := c.Get(config.AdminConfig.ReqAdminIdKey)
// 并写入退款日志
e = tx.WithContext(c).RefundLog.Create(&model.RefundLog{
Sn: srv.refundLogSrv.GenerateSN("RL", 4),
RecordID: refundRecord.ID,
UserID: order.UserID,
HandleID: int32(adminId.(uint)),
OrderAmount: refundRecord.OrderAmount,
RefundAmount: refundRecord.RefundAmount,
RefundStatus: constant.RefundStatusRefunding,
CreateTime: int32(time.Now().Unix()),
})
if err = response.CheckErr(e, "RefundLog Create err"); err != nil {
return
}
// TODO 执行远程退款后 更改退款状态
return tx.Commit()
}

View File

@@ -0,0 +1,71 @@
package finance
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/constant"
"likeadmin/core/response"
"likeadmin/dao"
"math/rand"
"strconv"
"time"
)
type IRefundLogService interface {
List(c *gin.Context, listReq req.RefundLogListReq) (res []resp.RefundLogResp, e error)
GenerateSN(prefix string, randSuffixLength int) string
}
// NewRefundLogService 初始化
func NewRefundLogService(db *gorm.DB, dao *dao.Query) IRefundLogService {
return &refundLogService{db: db, dao: dao}
}
// refundLogService 退款日志服务实现类
type refundLogService struct {
db *gorm.DB
dao *dao.Query
}
// List 退款日志列表
func (srv refundLogService) List(c *gin.Context, listReq req.RefundLogListReq) (res []resp.RefundLogResp, e error) {
m := srv.dao.RefundLog
a := srv.dao.SystemAuthAdmin
q := m.WithContext(c).Where(m.RecordID.Eq(listReq.RecordId))
// 数据
objs, err := q.Preload(m.Admin.Select(a.ID, a.Nickname)).Order(m.ID.Desc()).Find()
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
var resps []resp.RefundLogResp
response.Copy(&resps, objs)
for i, resp := range resps {
resps[i].RefundStatusText = constant.GetRefundStatusDesc(resp.RefundStatus)
}
return resps, nil
}
// GenerateSN 生成随机单号
func (srv refundLogService) GenerateSN(prefix string, randSuffixLength int) string {
suffix := ""
for i := 0; i < randSuffixLength; i++ {
suffix += strconv.Itoa(rand.Intn(10))
}
sn := prefix + time.Now().Format("20060102150405") + suffix
ua := srv.dao.RefundLog
_, err := ua.Where(ua.Sn.Eq(sn)).Select(ua.Sn).Take()
if err == gorm.ErrRecordNotFound {
return sn
}
return srv.GenerateSN(prefix, randSuffixLength)
}

View File

@@ -0,0 +1,147 @@
package finance
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/constant"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/util"
"math/rand"
"strconv"
"time"
)
type IRefundRecordService interface {
List(c *gin.Context, page request.PageReq, listReq req.RefundRecordListReq) (res response.PageResp, e error)
Stat(c *gin.Context) (resp resp.Stat, e error)
GenerateSN(prefix string, randSuffixLength int) string
}
// NewRefundRecordService 初始化
func NewRefundRecordService(db *gorm.DB, dao *dao.Query) IRefundRecordService {
return &refundRecordService{db: db, dao: dao}
}
// refundRecordService 退款记录服务实现类
type refundRecordService struct {
db *gorm.DB
dao *dao.Query
}
// List 退款记录列表
func (srv refundRecordService) List(c *gin.Context, page request.PageReq, listReq req.RefundRecordListReq) (res response.PageResp, e error) {
// 分页信息
limit := page.PageSize
offset := page.PageSize * (page.PageNo - 1)
m := srv.dao.RefundRecord
u := srv.dao.User
q := m.WithContext(c)
// 查询
if listReq.Sn != "" {
q = q.Where(m.Sn.Eq(listReq.Sn))
}
if listReq.OrderSn != "" {
q = q.Where(m.OrderSn.Eq(listReq.OrderSn))
}
if listReq.UserSn > 0 {
q = q.Where(m.UserSn.Eq(listReq.UserSn))
}
if listReq.RefundType > 0 {
q = q.Where(m.RefundType.Eq(listReq.RefundType))
}
// 时间范围查询
if listReq.StartTime != "" && listReq.EndTime != "" {
startTime, err := util.DateToTimestamp(listReq.StartTime)
if e = response.CheckErr(err, "DateToTimestamp err"); e != nil {
return
}
endTime, err := util.DateToTimestamp(listReq.EndTime)
if e = response.CheckErr(err, "DateToTimestamp err"); e != nil {
return
}
q = q.Where(m.CreateTime.Gt(int32(startTime)), m.CreateTime.Lt(int32(endTime)))
}
// 总数
count, err := q.Count()
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
// 数据
objs, err := q.Preload(m.User.Select(u.ID, u.Avatar, u.Nickname)).Limit(limit).Offset(offset).Order(m.ID.Desc()).Find()
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
var resps []resp.RefundRecordResp
response.Copy(&resps, objs)
for i, resp := range resps {
resps[i].User.Avatar = util.UrlUtil.ToAbsoluteUrl(resp.User.Avatar)
resps[i].RefundTypeText = constant.GetRefundTypeDesc(resp.RefundType)
resps[i].RefundStatusText = constant.GetRefundStatusDesc(resp.RefundStatus)
}
return response.PageResp{
PageNo: page.PageNo,
PageSize: page.PageSize,
Count: count,
Lists: resps,
}, nil
}
// Stat 统计退款金额
func (srv refundRecordService) Stat(c *gin.Context) (resp resp.Stat, e error) {
m := srv.dao.RefundRecord
q := m.WithContext(c)
//累计退款金额
err := q.Select(m.OrderAmount.Sum().As("total")).Scan(&resp)
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
//累计退款中金额
err = q.Where(m.RefundStatus.Eq(constant.RefundStatusRefunding)).Select(m.OrderAmount.Sum().As("ing")).Scan(&resp)
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
//累计已退款金额
err = q.Where(m.RefundStatus.Eq(constant.RefundStatusRefunded)).Select(m.OrderAmount.Sum().As("success")).Scan(&resp)
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
//累计退款失败金额
err = q.Where(m.RefundStatus.Eq(constant.RefundStatusFail)).Select(m.OrderAmount.Sum().As("error")).Scan(&resp)
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
return
}
// GenerateSN 生成随机单号
func (srv refundRecordService) GenerateSN(prefix string, randSuffixLength int) string {
suffix := ""
for i := 0; i < randSuffixLength; i++ {
suffix += strconv.Itoa(rand.Intn(10))
}
sn := prefix + time.Now().Format("20060102150405") + suffix
ua := srv.dao.RefundRecord
_, err := ua.Where(ua.Sn.Eq(sn)).Select(ua.Sn).Take()
if err == gorm.ErrRecordNotFound {
return sn
}
return srv.GenerateSN(prefix, randSuffixLength)
}

View File

@@ -0,0 +1,54 @@
package setting
import (
"encoding/json"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/response"
"likeadmin/util"
)
type ISettingLoginService interface {
Detail() (res resp.SettingLoginResp, e error)
Save(editReq req.SettingLoginReq) (e error)
}
// NewSettingLoginService 初始化
func NewSettingLoginService(db *gorm.DB) ISettingLoginService {
return &settingLoginService{db: db}
}
// settingLoginService 系统登录服务实现类
type settingLoginService struct {
db *gorm.DB
}
// 配置详情
func (loginSrv settingLoginService) Detail() (res resp.SettingLoginResp, e error) {
str, err := util.ConfigUtil.GetVal(loginSrv.db, "login", "config", "{\"loginWay\":[1,2],\"forceBindMobile\":0,\"openAgreement\":1,\"openOtherAuth\":1,\"autoLoginAuth\":[1,2]}")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
_ = json.Unmarshal([]byte(str), &res)
return
}
// Save
func (loginSrv settingLoginService) Save(editReq req.SettingLoginReq) (e error) {
marshal, err := json.Marshal(editReq)
if err != nil {
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
err = util.ConfigUtil.Set(loginSrv.db, "login", "config", string(marshal))
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
// 更新缓存
util.RedisUtil.HDel("login", "config")
return
}

View File

@@ -0,0 +1,109 @@
package setting
import (
"encoding/json"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/model"
)
type INoticeSettingService interface {
List(c *gin.Context, page request.PageReq, listReq req.NoticeSettingListReq) (res response.PageResp, e error)
Detail(c *gin.Context, id int32) (res resp.NoticeSettingResp, e error)
Edit(c *gin.Context, editReq req.NoticeSettingEditReq) (e error)
}
// NewNoticeSettingService 初始化
func NewNoticeSettingService(db *gorm.DB, dao *dao.Query) INoticeSettingService {
return &noticeSettingService{db: db, dao: dao}
}
// noticeSettingService 通知设置服务实现类
type noticeSettingService struct {
db *gorm.DB
dao *dao.Query
}
// List 通知设置列表
func (srv noticeSettingService) List(c *gin.Context, page request.PageReq, listReq req.NoticeSettingListReq) (res response.PageResp, e error) {
// 分页信息
limit := page.PageSize
offset := page.PageSize * (page.PageNo - 1)
// 总数
var count int64
m := srv.dao.NoticeSetting
q := m.WithContext(c)
q = q.Where(m.Recipient.Eq(listReq.Recipient))
count, err := q.Count()
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
notices, err := q.Limit(limit).Offset(offset).Find()
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
return response.PageResp{
PageNo: page.PageNo,
PageSize: page.PageSize,
Count: count,
Lists: notices,
}, nil
}
// Detail 通知设置详情
func (srv noticeSettingService) Detail(c *gin.Context, id int32) (res resp.NoticeSettingResp, e error) {
m := srv.dao.NoticeSetting
q := m.WithContext(c)
first, err := q.Where(m.ID.Eq(id)).First()
if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil {
return
}
if e = response.CheckErr(err, "Detail First err"); e != nil {
return
}
response.Copy(&res, first)
return
}
// Edit 通知设置编辑
func (srv noticeSettingService) Edit(c *gin.Context, editReq req.NoticeSettingEditReq) (e error) {
m := srv.dao.NoticeSetting
q := m.WithContext(c)
_, err := q.Where(m.ID.Eq(editReq.Id)).Select(m.ID).Take()
// 校验
if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil {
return
}
if e = response.CheckErr(err, "Edit First err"); e != nil {
return
}
SmsNoticeStr, _ := json.Marshal(editReq.Template.SmsNotice)
if err != nil {
return err
}
mod := &model.NoticeSetting{
ID: editReq.Id,
SmsNotice: string(SmsNoticeStr),
}
// 更新
_, err = q.Where(m.ID.Eq(editReq.Id)).Updates(mod)
e = response.CheckErr(err, "Edit Updates err")
return
}

View File

@@ -0,0 +1,177 @@
package setting
import (
"encoding/json"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/util"
"sort"
)
type IPaySettingService interface {
List(c *gin.Context) (res []resp.PaySettingResp, e error)
Detail(c *gin.Context, name string) (res resp.PaySettingResp, e error)
Set(c *gin.Context, editReq req.PaySettingEditReq) (e error)
GetWay(c *gin.Context) (all map[string][]resp.PaySceneResp, e error)
SetWay(c *gin.Context, setReq map[string][]req.PaySceneSetReq) (e error)
}
// NewPaySettingService 初始化
func NewPaySettingService(db *gorm.DB, dao *dao.Query) IPaySettingService {
return &paySettingService{db: db, dao: dao}
}
// paySettingService 通知设置服务实现类
type paySettingService struct {
db *gorm.DB
dao *dao.Query
}
// List 通知设置列表
func (srv paySettingService) List(c *gin.Context) (res []resp.PaySettingResp, e error) {
data, err := util.ConfigUtil.Get(srv.db, "pay_config")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
for _, name := range data {
if name != "" {
var item resp.PaySettingResp
err := json.Unmarshal([]byte(name), &item)
// 排除 default 值
if err != nil {
continue
}
item.Icon = util.UrlUtil.ToAbsoluteUrl(item.Icon)
res = append(res, item)
}
}
// 按照排序字段进行排序
sort.Slice(res, func(i, j int) bool {
return res[i].Sort < res[j].Sort
})
return res, nil
}
// Detail 支付设置详情
func (srv paySettingService) Detail(c *gin.Context, name string) (res resp.PaySettingResp, e error) {
data, err := util.ConfigUtil.GetVal(srv.db, "pay_config", name, "")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
var item resp.PaySettingResp
_ = json.Unmarshal([]byte(data), &item)
response.Copy(&res, item)
res.Icon = util.UrlUtil.ToAbsoluteUrl(res.Icon)
return
}
// Set 设置支付配置
func (srv paySettingService) Set(c *gin.Context, editReq req.PaySettingEditReq) (e error) {
editReq.Icon = util.UrlUtil.ToRelativeUrl(editReq.Icon)
marshal, err := json.Marshal(editReq)
if err != nil {
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
err = util.ConfigUtil.Set(srv.db, "pay_config", editReq.Name, string(marshal))
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
return
}
// GetWay 获取支付方式
func (srv paySettingService) GetWay(c *gin.Context) (all map[string][]resp.PaySceneResp, e error) {
// 获取支付方式列表
config, err := util.ConfigUtil.Get(srv.db, "pay_config")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
Cfg := make(map[string]resp.PaySettingResp)
for payName := range config {
if config[payName] != "" {
var item resp.PaySettingResp
err = json.Unmarshal([]byte(config[payName]), &item)
// 排除 default 值
if err != nil {
continue
}
item.Icon = util.UrlUtil.ToAbsoluteUrl(item.Icon)
Cfg[payName] = item
}
}
data, err := util.ConfigUtil.Get(srv.db, "pay_scene")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
var respall = make(map[string][]resp.PaySceneResp)
for sceneName := range data {
var res []resp.PaySceneResp
if data[sceneName] != "" {
var items []resp.PaySceneResp
err = json.Unmarshal([]byte(data[sceneName]), &items)
// 排除 default 值
if err != nil {
continue
}
res = append(res, items...)
// 更新支付的配置项
for i, _ := range res {
res[i].PaymentName = Cfg[res[i].PaymentName].Name
res[i].DisplayName = Cfg[res[i].PaymentName].DisplayName
res[i].Icon = Cfg[res[i].PaymentName].Icon
}
} else {
// 没有配置项时给定默认项
for payment := range Cfg {
res = append(res, resp.PaySceneResp{
Scene: sceneName,
IsDefault: 0,
Status: 0,
PaymentName: payment,
DisplayName: Cfg[payment].DisplayName,
Icon: Cfg[payment].Icon,
})
}
}
respall[sceneName] = res
}
return respall, nil
}
// SetWay 设置支付方式
func (srv paySettingService) SetWay(c *gin.Context, setReq map[string][]req.PaySceneSetReq) (e error) {
for name := range setReq {
marshal, err := json.Marshal(setReq[name])
if err != nil {
if e = response.CheckErr(err, "Save Set name err"); e != nil {
break
}
}
err = util.ConfigUtil.Set(srv.db, "pay_scene", name, string(marshal))
if e = response.CheckErr(err, "Save Set name err"); e != nil {
break
}
}
return
}

View File

@@ -0,0 +1,60 @@
package setting
import (
"encoding/json"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/util"
)
const (
RechargeStatusOn = 1 // 状态开启
RechargeStatusOff = 0 // 状态关闭
)
type IRechargeSettingService interface {
Detail(c *gin.Context) (res resp.RechargeSettingResp, e error)
Edit(c *gin.Context, editReq req.RechargeSettingEditReq) (e error)
}
// NewRechargeSettingService 初始化
func NewRechargeSettingService(db *gorm.DB, dao *dao.Query) IRechargeSettingService {
return &rechargeSettingService{db: db, dao: dao}
}
// rechargeSettingService 通知设置服务实现类
type rechargeSettingService struct {
db *gorm.DB
dao *dao.Query
}
// Detail 通知设置详情
func (srv rechargeSettingService) Detail(c *gin.Context) (res resp.RechargeSettingResp, e error) {
str, err := util.ConfigUtil.GetVal(srv.db, "recharge", "config", "")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
var item resp.RechargeSettingResp
_ = json.Unmarshal([]byte(str), &item)
response.Copy(&res, item)
return
}
// Edit 通知设置编辑
func (srv rechargeSettingService) Edit(c *gin.Context, editReq req.RechargeSettingEditReq) (e error) {
marshal, err := json.Marshal(editReq)
if err != nil {
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
err = util.ConfigUtil.Set(srv.db, "recharge", "config", string(marshal))
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
return
}

View File

@@ -0,0 +1,97 @@
package setting
import (
"encoding/json"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/util"
)
const (
SmsStatusOn = 1 // 状态开启
SmsStatusOff = 0 // 状态关闭
)
type ISmsSettingService interface {
List() (list []resp.SmsSettingResp, e error)
Detail(c *gin.Context, name string) (res resp.SmsSettingResp, e error)
Edit(c *gin.Context, editReq req.SmsSettingEditReq) (e error)
}
// NewSmsSettingService 初始化
func NewSmsSettingService(db *gorm.DB, dao *dao.Query) ISmsSettingService {
return &smsSettingService{db: db, dao: dao}
}
// smsSettingService 通知设置服务实现类
type smsSettingService struct {
db *gorm.DB
dao *dao.Query
}
// List 通知设置列表
func (srv smsSettingService) List() (list []resp.SmsSettingResp, e error) {
data, err := util.ConfigUtil.Get(srv.db, "sms")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
for _, name := range data {
if name != "" {
var item resp.SmsSettingResp
err := json.Unmarshal([]byte(name), &item)
// 排除 default 值
if err != nil {
continue
}
list = append(list, item)
}
}
return list, nil
}
// Detail 通知设置详情
func (srv smsSettingService) Detail(c *gin.Context, name string) (res resp.SmsSettingResp, e error) {
data, err := util.ConfigUtil.GetVal(srv.db, "sms", name, "")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
var item resp.SmsSettingResp
_ = json.Unmarshal([]byte(data), &item)
response.Copy(&res, item)
return
}
// Edit 通知设置编辑
func (srv smsSettingService) Edit(c *gin.Context, editReq req.SmsSettingEditReq) (e error) {
marshal, err := json.Marshal(editReq)
if err != nil {
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
err = util.ConfigUtil.Set(srv.db, "sms", editReq.Alias, string(marshal))
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
// 设置开启
if editReq.Status == SmsStatusOn {
err = util.ConfigUtil.Set(srv.db, "sms", "default", editReq.Alias)
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
// 删除缓存
util.RedisUtil.HDel("sms", "default")
util.RedisUtil.HDel("sms", editReq.Alias)
return
}

View File

@@ -1,26 +1,33 @@
package setting
import (
"encoding/json"
"fmt"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/response"
"likeadmin/util"
)
const (
StorageStatusOn = 1 // 状态开启
StorageStatusOff = 0 // 状态关闭
)
type ISettingStorageService interface {
List() ([]map[string]interface{}, error)
Detail(alias string) (res map[string]interface{}, e error)
List() (list []resp.StorageSettingResp, e error)
Detail(engine string) (res resp.StorageSettingResp, e error)
Edit(editReq req.SettingStorageEditReq) (e error)
Change(alias string, status int) (e error)
}
//NewSettingStorageService 初始化
// NewSettingStorageService 初始化
func NewSettingStorageService(db *gorm.DB) ISettingStorageService {
return &settingStorageService{db: db}
}
//settingStorageService 存储配置服务实现类
// settingStorageService 存储配置服务实现类
type settingStorageService struct {
db *gorm.DB
}
@@ -29,63 +36,100 @@ var storageList = []map[string]interface{}{
{"name": "本地存储", "alias": "local", "describe": "存储在本地服务器", "status": 0},
}
//List 存储列表
func (sSrv settingStorageService) List() ([]map[string]interface{}, error) {
// TODO: engine默认local
engine := "local"
mapList := storageList
for i := 0; i < len(mapList); i++ {
if engine == mapList[i]["alias"] {
mapList[i]["status"] = 1
// List 存储列表
func (sSrv settingStorageService) List() (list []resp.StorageSettingResp, e error) {
data, err := util.ConfigUtil.Get(sSrv.db, "storage")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
// 获取默认开启项
defaultEngine, err := util.ConfigUtil.GetVal(sSrv.db, "storage", "default", "local")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
for _, name := range data {
if name != "" {
var item resp.StorageSettingResp
err := json.Unmarshal([]byte(name), &item)
// 排除 default 值
if err != nil {
println(err.Error())
continue
}
if defaultEngine == item.Engine {
item.Status = StorageStatusOn
} else {
item.Status = StorageStatusOff
}
list = append(list, item)
}
}
return mapList, nil
return list, nil
}
//Detail 存储详情
func (sSrv settingStorageService) Detail(alias string) (res map[string]interface{}, e error) {
// TODO: engine默认local
engine := "local"
cnf, err := util.ConfigUtil.GetMap(sSrv.db, "storage", alias)
if e = response.CheckErr(err, "Detail GetMap err"); e != nil {
// Detail 存储详情
func (sSrv settingStorageService) Detail(engine string) (res resp.StorageSettingResp, e error) {
data, err := util.ConfigUtil.GetVal(sSrv.db, "storage", engine, "")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
status := 0
if engine == alias {
status = 1
}
return map[string]interface{}{
"name": cnf["name"],
"alias": alias,
"status": status,
}, nil
}
//Edit 存储编辑
func (sSrv settingStorageService) Edit(editReq req.SettingStorageEditReq) (e error) {
// TODO: engine默认local
engine := "local"
if engine != editReq.Alias {
return response.Failed.Make(fmt.Sprintf("engine:%s 暂时不支持", editReq.Alias))
}
json, err := util.ToolsUtil.ObjToJson(map[string]interface{}{"name": "本地存储"})
if e = response.CheckErr(err, "Edit ObjToJson err"); e != nil {
// 获取默认开启项
defaultEngine, err := util.ConfigUtil.GetVal(sSrv.db, "storage", "default", "local")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
err = util.ConfigUtil.Set(sSrv.db, "storage", editReq.Alias, json)
if e = response.CheckErr(err, "Edit Set alias err"); e != nil {
return
}
if editReq.Status == 1 {
err = util.ConfigUtil.Set(sSrv.db, "storage", "default", editReq.Alias)
var item resp.StorageSettingResp
_ = json.Unmarshal([]byte(data), &item)
if defaultEngine == item.Engine {
item.Status = StorageStatusOn
} else {
util.ConfigUtil.Set(sSrv.db, "storage", "default", "")
item.Status = StorageStatusOff
}
e = response.CheckErr(err, "Edit Set default err")
response.Copy(&res, item)
return
}
//Change 存储切换
// Edit 存储编辑
func (sSrv settingStorageService) Edit(editReq req.SettingStorageEditReq) (e error) {
// 设置开启
if editReq.Status == StorageStatusOn {
err := util.ConfigUtil.Set(sSrv.db, "storage", "default", editReq.Engine)
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
editReq.Status = 0
marshal, err := json.Marshal(editReq)
if err != nil {
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
}
err = util.ConfigUtil.Set(sSrv.db, "storage", editReq.Engine, string(marshal))
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
// 删除缓存
util.RedisUtil.HDel("storage", "default")
util.RedisUtil.HDel("storage", editReq.Engine)
return
}
// Change 存储切换
func (sSrv settingStorageService) Change(alias string, status int) (e error) {
// TODO: engine默认local
engine := "local"

View File

@@ -0,0 +1,48 @@
package setting
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/util"
)
type IUserService interface {
Get(c *gin.Context) (res resp.UserSetResp, e error)
Set(c *gin.Context, req req.UserSetReq) (e error)
}
// NewUserService 初始化
func NewUserService(db *gorm.DB, dao *dao.Query) IUserService {
return &userService{db: db, dao: dao}
}
// userService 系统管理员服务实现类
type userService struct {
db *gorm.DB
dao *dao.Query
}
// Get 用户设置
func (srv userService) Get(c *gin.Context) (res resp.UserSetResp, e error) {
str, err := util.ConfigUtil.GetVal(srv.db, "user", "defaultAvatar", "/api/static/default_avatar.png")
if e = response.CheckErr(err, "Detail Get err"); e != nil {
return
}
res.DefaultAvatar = str
res.DefaultAvatar = util.UrlUtil.ToAbsoluteUrl(res.DefaultAvatar)
return
}
// Set 设置用户配置
func (srv userService) Set(c *gin.Context, req req.UserSetReq) (e error) {
path := util.UrlUtil.ToRelativeUrl(req.DefaultAvatar)
err := util.ConfigUtil.Set(srv.db, "user", "defaultAvatar", path)
if e = response.CheckErr(err, "Save Set name err"); e != nil {
return
}
return
}

View File

@@ -31,25 +31,25 @@ type ISystemAuthAdminService interface {
CacheAdminUserByUid(id uint) (err error)
}
//NewSystemAuthAdminService 初始化
// NewSystemAuthAdminService 初始化
func NewSystemAuthAdminService(db *gorm.DB, permSrv ISystemAuthPermService, roleSrv ISystemAuthRoleService) ISystemAuthAdminService {
return &systemAuthAdminService{db: db, permSrv: permSrv, roleSrv: roleSrv}
}
//systemAuthAdminService 系统管理员服务实现类
// systemAuthAdminService 系统管理员服务实现类
type systemAuthAdminService struct {
db *gorm.DB
permSrv ISystemAuthPermService
roleSrv ISystemAuthRoleService
}
//FindByUsername 根据账号查找管理员
// FindByUsername 根据账号查找管理员
func (adminSrv systemAuthAdminService) FindByUsername(username string) (admin system.SystemAuthAdmin, err error) {
err = adminSrv.db.Where("username = ?", username).Limit(1).First(&admin).Error
return
}
//Self 当前管理员
// Self 当前管理员
func (adminSrv systemAuthAdminService) Self(adminId uint) (res resp.SystemAuthAdminSelfResp, e error) {
// 管理员信息
var sysAdmin system.SystemAuthAdmin
@@ -92,7 +92,7 @@ func (adminSrv systemAuthAdminService) Self(adminId uint) (res resp.SystemAuthAd
return resp.SystemAuthAdminSelfResp{User: admin, Permissions: auths}, nil
}
//List 管理员列表
// List 管理员列表
func (adminSrv systemAuthAdminService) List(page request.PageReq, listReq req.SystemAuthAdminListReq) (res response.PageResp, e error) {
// 分页信息
limit := page.PageSize
@@ -141,7 +141,7 @@ func (adminSrv systemAuthAdminService) List(page request.PageReq, listReq req.Sy
}, nil
}
//Detail 管理员详细
// Detail 管理员详细
func (adminSrv systemAuthAdminService) Detail(id uint) (res resp.SystemAuthAdminResp, e error) {
var sysAdmin system.SystemAuthAdmin
err := adminSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&sysAdmin).Error
@@ -159,7 +159,7 @@ func (adminSrv systemAuthAdminService) Detail(id uint) (res resp.SystemAuthAdmin
return
}
//Add 管理员新增
// Add 管理员新增
func (adminSrv systemAuthAdminService) Add(addReq req.SystemAuthAdminAddReq) (e error) {
var sysAdmin system.SystemAuthAdmin
// 检查username
@@ -205,7 +205,7 @@ func (adminSrv systemAuthAdminService) Add(addReq req.SystemAuthAdminAddReq) (e
return
}
//Edit 管理员编辑
// Edit 管理员编辑
func (adminSrv systemAuthAdminService) Edit(c *gin.Context, editReq req.SystemAuthAdminEditReq) (e error) {
// 检查id
err := adminSrv.db.Where("id = ? AND is_delete = ?", editReq.ID, 0).Limit(1).First(&system.SystemAuthAdmin{}).Error
@@ -288,7 +288,7 @@ func (adminSrv systemAuthAdminService) Edit(c *gin.Context, editReq req.SystemAu
return
}
//Update 管理员更新
// Update 管理员更新
func (adminSrv systemAuthAdminService) Update(c *gin.Context, updateReq req.SystemAuthAdminUpdateReq, adminId uint) (e error) {
// 检查id
var admin system.SystemAuthAdmin
@@ -347,7 +347,7 @@ func (adminSrv systemAuthAdminService) Update(c *gin.Context, updateReq req.Syst
return
}
//Del 管理员删除
// Del 管理员删除
func (adminSrv systemAuthAdminService) Del(c *gin.Context, id uint) (e error) {
var admin system.SystemAuthAdmin
err := adminSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).First(&admin).Error
@@ -368,7 +368,7 @@ func (adminSrv systemAuthAdminService) Del(c *gin.Context, id uint) (e error) {
return
}
//Disable 管理员状态切换
// Disable 管理员状态切换
func (adminSrv systemAuthAdminService) Disable(c *gin.Context, id uint) (e error) {
var admin system.SystemAuthAdmin
err := adminSrv.db.Where("id = ? AND is_delete = ?", id, 0).Limit(1).Find(&admin).Error
@@ -385,12 +385,13 @@ func (adminSrv systemAuthAdminService) Disable(c *gin.Context, id uint) (e error
if admin.IsDisable == 0 {
isDisable = 1
}
err = adminSrv.db.Model(&admin).Updates(system.SystemAuthAdmin{IsDisable: isDisable, UpdateTime: time.Now().Unix()}).Error
//system.SystemAuthAdmin{IsDisable: isDisable, UpdateTime: time.Now().Unix()}
err = adminSrv.db.Model(&admin).Updates(map[string]interface{}{"is_disable": isDisable, "update_time": time.Now().Unix()}).Error
e = response.CheckErr(err, "Disable Updates err")
return
}
//CacheAdminUserByUid 缓存管理员
// CacheAdminUserByUid 缓存管理员
func (adminSrv systemAuthAdminService) CacheAdminUserByUid(id uint) (err error) {
var admin system.SystemAuthAdmin
err = adminSrv.db.Where("id = ?", id).Limit(1).First(&admin).Error

View File

@@ -7,10 +7,10 @@ import (
"gorm.io/gorm"
"likeadmin/admin/schemas/req"
"likeadmin/admin/schemas/resp"
"likeadmin/constant"
"likeadmin/core/request"
"likeadmin/core/response"
"likeadmin/dao"
"likeadmin/enum"
"likeadmin/model"
"likeadmin/util"
"math/rand"
@@ -23,6 +23,7 @@ type IUserService interface {
Detail(c *gin.Context, id int32) (res resp.UserResp, e error)
EditField(c *gin.Context, req req.UserEditReq) (e error)
AdjustMoney(c *gin.Context, req req.AdjustMoneyReq) (e error)
GenerateSN(randSuffixLength int) int32
}
// NewUserService 初始化
@@ -83,12 +84,18 @@ func (userSrv userService) List(c *gin.Context, page request.PageReq, listReq re
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
for _, user := range users {
user.Avatar = util.UrlUtil.ToAbsoluteUrl(user.Avatar)
}
var lists []resp.UserResp
response.Copy(&lists, users)
return response.PageResp{
PageNo: page.PageNo,
PageSize: page.PageSize,
Count: count,
Lists: users,
Lists: lists,
}, nil
}
@@ -143,7 +150,7 @@ func (userSrv userService) AdjustMoney(c *gin.Context, req req.AdjustMoneyReq) (
return
}
if req.Action == enum.INC {
if req.Action == constant.INC {
// 给余额和充值总数加上金额
_, e = tx.User.WithContext(c).Where(u.ID.Eq(req.Id)).UpdateSimple(u.UserMoney.Add(req.Num))
if err = response.CheckErr(e, "增加余额失败"); err != nil {
@@ -152,11 +159,11 @@ func (userSrv userService) AdjustMoney(c *gin.Context, req req.AdjustMoneyReq) (
// 写入余额变化日志
e = tx.UserAccountLog.Create(&model.UserAccountLog{
Sn: userSrv.generateSN("sn", 10),
Sn: user.Sn,
UserID: user.ID,
ChangeObject: enum.GetChangeObject(enum.UmIncAdmin),
ChangeType: enum.UmIncAdmin,
Action: enum.INC,
ChangeObject: constant.GetChangeObject(constant.UmIncAdmin),
ChangeType: constant.UmIncAdmin,
Action: constant.INC,
ChangeAmount: req.Num,
LeftAmount: user.UserMoney + req.Num,
Remark: req.Remark,
@@ -166,7 +173,7 @@ func (userSrv userService) AdjustMoney(c *gin.Context, req req.AdjustMoneyReq) (
return
}
} else if req.Action == enum.DEC {
} else if req.Action == constant.DEC {
// 检查余额是否大于等当前值
if user.UserMoney < req.Num {
err = response.CheckErr(errors.New("余额不足"), "扣除余额失败")
@@ -184,11 +191,11 @@ func (userSrv userService) AdjustMoney(c *gin.Context, req req.AdjustMoneyReq) (
// 写入余额变化日志
e = tx.UserAccountLog.Create(&model.UserAccountLog{
Sn: userSrv.generateSN("sn", 10),
Sn: user.Sn,
UserID: user.ID,
ChangeObject: enum.GetChangeObject(enum.UmIncAdmin),
ChangeType: enum.UmDecAdmin,
Action: enum.DEC,
ChangeObject: constant.GetChangeObject(constant.UmIncAdmin),
ChangeType: constant.UmDecAdmin,
Action: constant.DEC,
ChangeAmount: req.Num,
LeftAmount: m,
Remark: req.Remark,
@@ -203,19 +210,20 @@ func (userSrv userService) AdjustMoney(c *gin.Context, req req.AdjustMoneyReq) (
}
// 生成随机单号
func (userSrv userService) generateSN(prefix string, randSuffixLength int) string {
func (userSrv userService) GenerateSN(randSuffixLength int) int32 {
suffix := ""
for i := 0; i < randSuffixLength; i++ {
suffix += strconv.Itoa(rand.Intn(10))
}
sn := prefix + time.Now().Format("20060102150405") + suffix
sn := time.Now().Format("20060102150405") + suffix
Sn, _ := strconv.ParseInt(sn, 10, 32)
ua := userSrv.dao.UserAccountLog
_, err := ua.Where(ua.Sn.Eq(sn)).Select(ua.Sn).Take()
_, err := ua.Where(ua.Sn.Eq(Sn)).Select(ua.Sn).Take()
if err == gorm.ErrRecordNotFound {
return sn
return int32(Sn)
}
return userSrv.generateSN(prefix, randSuffixLength)
return userSrv.GenerateSN(randSuffixLength)
}

View File

@@ -11,7 +11,7 @@ import (
var Config = loadConfig(".")
//envConfig 环境配置
// envConfig 环境配置
type envConfig struct {
RootPath string // 项目根目录
GinMode string `mapstructure:"GIN_MODE"` // gin运行模式
@@ -39,7 +39,7 @@ type envConfig struct {
UploadVideoExt []string // 上传视频扩展
}
//loadConfig 加载配置
// loadConfig 加载配置
func loadConfig(envPath string) envConfig {
var cfgPath string
flag.StringVar(&cfgPath, "c", "", "config file envPath.")
@@ -65,7 +65,7 @@ func loadConfig(envPath string) envConfig {
// 资源访问前缀
PublicPrefix: "/api/uploads",
// 上传文件路径
UploadDirectory: "/tmp/uploads/likeadmin-go/",
UploadDirectory: "/tmp/uploads/byteadmin/",
// Redis源配置
RedisUrl: "redis://localhost:6379",
RedisPoolSize: 100,

View File

@@ -1,4 +1,4 @@
package enum
package constant
const (
UM = 1 // 变动对象 用户余额(user_money)
@@ -12,6 +12,28 @@ const (
// UmDecAdmin 用户余额减少类型
UmDecAdmin = 100
UmDecRechargeRefund = 101
// 退款状态
RefundStatusRefunded = 1 // 已退款
RefundStatusRefunding = 0 // 退款中
RefundStatusFail = 2 // 退款失败
// 支付状态
PayWayStatusPaid = 1 //已支付
PayWayStatusUnpaid = 2 //未支付
// 退款方式
RefundWayOnline = 1 //结上退款
RefundWayOffline = 2 // 线下退款
// 退款类型
RefundTypeBack = 1 //后台退款
RefundTypeUser = 2 //用户退款
// 订单类型
OrderTypeRecharge = "recharge" // 充值订单
OrderTypeOrder = "order" // 商品订单
)
var (
@@ -33,6 +55,22 @@ var (
UmIncRecharge: "充值增加余额",
UmDecRechargeRefund: "充值订单退款减少余额",
}
RefundStatusDesc = map[int32]string{
RefundStatusRefunding: "退款中",
RefundStatusFail: "退款失败",
RefundStatusRefunded: "已退款",
}
PayWayStatusDesc = map[int32]string{
PayWayStatusPaid: "已支付",
PayWayStatusUnpaid: "未支付",
}
RefundTypeDesc = map[int32]string{
RefundTypeBack: "后台退款",
RefundTypeUser: "用户退款",
}
)
// GetChangeObject 获取变动对象
@@ -51,6 +89,13 @@ func GetUserMoneyChangeTypeDesc(changeType int32) string {
return ChangeTypeDesc[changeType]
}
func GetRefundTypeDesc(refundType int32) string {
return RefundTypeDesc[refundType]
}
func GetRefundStatusDesc(refundStatus int32) string {
return RefundStatusDesc[refundStatus]
}
func inArray(needle int32, haystack []int32) bool {
for _, item := range haystack {
if item == needle {

View File

@@ -16,39 +16,64 @@ import (
)
var (
Q = new(Query)
User *user
UserAccountLog *userAccountLog
Q = new(Query)
NoticeSetting *noticeSetting
RechargeOrder *rechargeOrder
RefundLog *refundLog
RefundRecord *refundRecord
SystemAuthAdmin *systemAuthAdmin
User *user
UserAccountLog *userAccountLog
)
func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
*Q = *Use(db, opts...)
NoticeSetting = &Q.NoticeSetting
RechargeOrder = &Q.RechargeOrder
RefundLog = &Q.RefundLog
RefundRecord = &Q.RefundRecord
SystemAuthAdmin = &Q.SystemAuthAdmin
User = &Q.User
UserAccountLog = &Q.UserAccountLog
}
func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
return &Query{
db: db,
User: newUser(db, opts...),
UserAccountLog: newUserAccountLog(db, opts...),
db: db,
NoticeSetting: newNoticeSetting(db, opts...),
RechargeOrder: newRechargeOrder(db, opts...),
RefundLog: newRefundLog(db, opts...),
RefundRecord: newRefundRecord(db, opts...),
SystemAuthAdmin: newSystemAuthAdmin(db, opts...),
User: newUser(db, opts...),
UserAccountLog: newUserAccountLog(db, opts...),
}
}
type Query struct {
db *gorm.DB
User user
UserAccountLog userAccountLog
NoticeSetting noticeSetting
RechargeOrder rechargeOrder
RefundLog refundLog
RefundRecord refundRecord
SystemAuthAdmin systemAuthAdmin
User user
UserAccountLog userAccountLog
}
func (q *Query) Available() bool { return q.db != nil }
func (q *Query) clone(db *gorm.DB) *Query {
return &Query{
db: db,
User: q.User.clone(db),
UserAccountLog: q.UserAccountLog.clone(db),
db: db,
NoticeSetting: q.NoticeSetting.clone(db),
RechargeOrder: q.RechargeOrder.clone(db),
RefundLog: q.RefundLog.clone(db),
RefundRecord: q.RefundRecord.clone(db),
SystemAuthAdmin: q.SystemAuthAdmin.clone(db),
User: q.User.clone(db),
UserAccountLog: q.UserAccountLog.clone(db),
}
}
@@ -62,21 +87,36 @@ func (q *Query) WriteDB() *Query {
func (q *Query) ReplaceDB(db *gorm.DB) *Query {
return &Query{
db: db,
User: q.User.replaceDB(db),
UserAccountLog: q.UserAccountLog.replaceDB(db),
db: db,
NoticeSetting: q.NoticeSetting.replaceDB(db),
RechargeOrder: q.RechargeOrder.replaceDB(db),
RefundLog: q.RefundLog.replaceDB(db),
RefundRecord: q.RefundRecord.replaceDB(db),
SystemAuthAdmin: q.SystemAuthAdmin.replaceDB(db),
User: q.User.replaceDB(db),
UserAccountLog: q.UserAccountLog.replaceDB(db),
}
}
type queryCtx struct {
User IUserDo
UserAccountLog IUserAccountLogDo
NoticeSetting INoticeSettingDo
RechargeOrder IRechargeOrderDo
RefundLog IRefundLogDo
RefundRecord IRefundRecordDo
SystemAuthAdmin ISystemAuthAdminDo
User IUserDo
UserAccountLog IUserAccountLogDo
}
func (q *Query) WithContext(ctx context.Context) *queryCtx {
return &queryCtx{
User: q.User.WithContext(ctx),
UserAccountLog: q.UserAccountLog.WithContext(ctx),
NoticeSetting: q.NoticeSetting.WithContext(ctx),
RechargeOrder: q.RechargeOrder.WithContext(ctx),
RefundLog: q.RefundLog.WithContext(ctx),
RefundRecord: q.RefundRecord.WithContext(ctx),
SystemAuthAdmin: q.SystemAuthAdmin.WithContext(ctx),
User: q.User.WithContext(ctx),
UserAccountLog: q.UserAccountLog.WithContext(ctx),
}
}

View File

@@ -0,0 +1,424 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"likeadmin/model"
)
func newNoticeSetting(db *gorm.DB, opts ...gen.DOOption) noticeSetting {
_noticeSetting := noticeSetting{}
_noticeSetting.noticeSettingDo.UseDB(db, opts...)
_noticeSetting.noticeSettingDo.UseModel(&model.NoticeSetting{})
tableName := _noticeSetting.noticeSettingDo.TableName()
_noticeSetting.ALL = field.NewAsterisk(tableName)
_noticeSetting.ID = field.NewInt32(tableName, "id")
_noticeSetting.SceneID = field.NewInt32(tableName, "scene_id")
_noticeSetting.SceneName = field.NewString(tableName, "scene_name")
_noticeSetting.SceneDesc = field.NewString(tableName, "scene_desc")
_noticeSetting.Recipient = field.NewInt32(tableName, "recipient")
_noticeSetting.Type = field.NewInt32(tableName, "type")
_noticeSetting.SystemNotice = field.NewString(tableName, "system_notice")
_noticeSetting.SmsNotice = field.NewString(tableName, "sms_notice")
_noticeSetting.OaNotice = field.NewString(tableName, "oa_notice")
_noticeSetting.MnpNotice = field.NewString(tableName, "mnp_notice")
_noticeSetting.Support = field.NewString(tableName, "support")
_noticeSetting.UpdateTime = field.NewInt32(tableName, "update_time")
_noticeSetting.fillFieldMap()
return _noticeSetting
}
type noticeSetting struct {
noticeSettingDo
ALL field.Asterisk
ID field.Int32
SceneID field.Int32 // 场景id
SceneName field.String // 场景名称
SceneDesc field.String // 场景描述
Recipient field.Int32 // 接收者 1-用户 2-平台
Type field.Int32 // 通知类型: 1-业务通知 2-验证码
SystemNotice field.String // 系统通知设置
SmsNotice field.String // 短信通知设置
OaNotice field.String // 公众号通知设置
MnpNotice field.String // 小程序通知设置
Support field.String // 支持的发送类型 1-系统通知 2-短信通知 3-微信模板消息 4-小程序提醒
UpdateTime field.Int32 // 更新时间
fieldMap map[string]field.Expr
}
func (n noticeSetting) Table(newTableName string) *noticeSetting {
n.noticeSettingDo.UseTable(newTableName)
return n.updateTableName(newTableName)
}
func (n noticeSetting) As(alias string) *noticeSetting {
n.noticeSettingDo.DO = *(n.noticeSettingDo.As(alias).(*gen.DO))
return n.updateTableName(alias)
}
func (n *noticeSetting) updateTableName(table string) *noticeSetting {
n.ALL = field.NewAsterisk(table)
n.ID = field.NewInt32(table, "id")
n.SceneID = field.NewInt32(table, "scene_id")
n.SceneName = field.NewString(table, "scene_name")
n.SceneDesc = field.NewString(table, "scene_desc")
n.Recipient = field.NewInt32(table, "recipient")
n.Type = field.NewInt32(table, "type")
n.SystemNotice = field.NewString(table, "system_notice")
n.SmsNotice = field.NewString(table, "sms_notice")
n.OaNotice = field.NewString(table, "oa_notice")
n.MnpNotice = field.NewString(table, "mnp_notice")
n.Support = field.NewString(table, "support")
n.UpdateTime = field.NewInt32(table, "update_time")
n.fillFieldMap()
return n
}
func (n *noticeSetting) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := n.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (n *noticeSetting) fillFieldMap() {
n.fieldMap = make(map[string]field.Expr, 12)
n.fieldMap["id"] = n.ID
n.fieldMap["scene_id"] = n.SceneID
n.fieldMap["scene_name"] = n.SceneName
n.fieldMap["scene_desc"] = n.SceneDesc
n.fieldMap["recipient"] = n.Recipient
n.fieldMap["type"] = n.Type
n.fieldMap["system_notice"] = n.SystemNotice
n.fieldMap["sms_notice"] = n.SmsNotice
n.fieldMap["oa_notice"] = n.OaNotice
n.fieldMap["mnp_notice"] = n.MnpNotice
n.fieldMap["support"] = n.Support
n.fieldMap["update_time"] = n.UpdateTime
}
func (n noticeSetting) clone(db *gorm.DB) noticeSetting {
n.noticeSettingDo.ReplaceConnPool(db.Statement.ConnPool)
return n
}
func (n noticeSetting) replaceDB(db *gorm.DB) noticeSetting {
n.noticeSettingDo.ReplaceDB(db)
return n
}
type noticeSettingDo struct{ gen.DO }
type INoticeSettingDo interface {
gen.SubQuery
Debug() INoticeSettingDo
WithContext(ctx context.Context) INoticeSettingDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() INoticeSettingDo
WriteDB() INoticeSettingDo
As(alias string) gen.Dao
Session(config *gorm.Session) INoticeSettingDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) INoticeSettingDo
Not(conds ...gen.Condition) INoticeSettingDo
Or(conds ...gen.Condition) INoticeSettingDo
Select(conds ...field.Expr) INoticeSettingDo
Where(conds ...gen.Condition) INoticeSettingDo
Order(conds ...field.Expr) INoticeSettingDo
Distinct(cols ...field.Expr) INoticeSettingDo
Omit(cols ...field.Expr) INoticeSettingDo
Join(table schema.Tabler, on ...field.Expr) INoticeSettingDo
LeftJoin(table schema.Tabler, on ...field.Expr) INoticeSettingDo
RightJoin(table schema.Tabler, on ...field.Expr) INoticeSettingDo
Group(cols ...field.Expr) INoticeSettingDo
Having(conds ...gen.Condition) INoticeSettingDo
Limit(limit int) INoticeSettingDo
Offset(offset int) INoticeSettingDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) INoticeSettingDo
Unscoped() INoticeSettingDo
Create(values ...*model.NoticeSetting) error
CreateInBatches(values []*model.NoticeSetting, batchSize int) error
Save(values ...*model.NoticeSetting) error
First() (*model.NoticeSetting, error)
Take() (*model.NoticeSetting, error)
Last() (*model.NoticeSetting, error)
Find() ([]*model.NoticeSetting, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.NoticeSetting, err error)
FindInBatches(result *[]*model.NoticeSetting, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*model.NoticeSetting) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) INoticeSettingDo
Assign(attrs ...field.AssignExpr) INoticeSettingDo
Joins(fields ...field.RelationField) INoticeSettingDo
Preload(fields ...field.RelationField) INoticeSettingDo
FirstOrInit() (*model.NoticeSetting, error)
FirstOrCreate() (*model.NoticeSetting, error)
FindByPage(offset int, limit int) (result []*model.NoticeSetting, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) INoticeSettingDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (n noticeSettingDo) Debug() INoticeSettingDo {
return n.withDO(n.DO.Debug())
}
func (n noticeSettingDo) WithContext(ctx context.Context) INoticeSettingDo {
return n.withDO(n.DO.WithContext(ctx))
}
func (n noticeSettingDo) ReadDB() INoticeSettingDo {
return n.Clauses(dbresolver.Read)
}
func (n noticeSettingDo) WriteDB() INoticeSettingDo {
return n.Clauses(dbresolver.Write)
}
func (n noticeSettingDo) Session(config *gorm.Session) INoticeSettingDo {
return n.withDO(n.DO.Session(config))
}
func (n noticeSettingDo) Clauses(conds ...clause.Expression) INoticeSettingDo {
return n.withDO(n.DO.Clauses(conds...))
}
func (n noticeSettingDo) Returning(value interface{}, columns ...string) INoticeSettingDo {
return n.withDO(n.DO.Returning(value, columns...))
}
func (n noticeSettingDo) Not(conds ...gen.Condition) INoticeSettingDo {
return n.withDO(n.DO.Not(conds...))
}
func (n noticeSettingDo) Or(conds ...gen.Condition) INoticeSettingDo {
return n.withDO(n.DO.Or(conds...))
}
func (n noticeSettingDo) Select(conds ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.Select(conds...))
}
func (n noticeSettingDo) Where(conds ...gen.Condition) INoticeSettingDo {
return n.withDO(n.DO.Where(conds...))
}
func (n noticeSettingDo) Order(conds ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.Order(conds...))
}
func (n noticeSettingDo) Distinct(cols ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.Distinct(cols...))
}
func (n noticeSettingDo) Omit(cols ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.Omit(cols...))
}
func (n noticeSettingDo) Join(table schema.Tabler, on ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.Join(table, on...))
}
func (n noticeSettingDo) LeftJoin(table schema.Tabler, on ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.LeftJoin(table, on...))
}
func (n noticeSettingDo) RightJoin(table schema.Tabler, on ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.RightJoin(table, on...))
}
func (n noticeSettingDo) Group(cols ...field.Expr) INoticeSettingDo {
return n.withDO(n.DO.Group(cols...))
}
func (n noticeSettingDo) Having(conds ...gen.Condition) INoticeSettingDo {
return n.withDO(n.DO.Having(conds...))
}
func (n noticeSettingDo) Limit(limit int) INoticeSettingDo {
return n.withDO(n.DO.Limit(limit))
}
func (n noticeSettingDo) Offset(offset int) INoticeSettingDo {
return n.withDO(n.DO.Offset(offset))
}
func (n noticeSettingDo) Scopes(funcs ...func(gen.Dao) gen.Dao) INoticeSettingDo {
return n.withDO(n.DO.Scopes(funcs...))
}
func (n noticeSettingDo) Unscoped() INoticeSettingDo {
return n.withDO(n.DO.Unscoped())
}
func (n noticeSettingDo) Create(values ...*model.NoticeSetting) error {
if len(values) == 0 {
return nil
}
return n.DO.Create(values)
}
func (n noticeSettingDo) CreateInBatches(values []*model.NoticeSetting, batchSize int) error {
return n.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (n noticeSettingDo) Save(values ...*model.NoticeSetting) error {
if len(values) == 0 {
return nil
}
return n.DO.Save(values)
}
func (n noticeSettingDo) First() (*model.NoticeSetting, error) {
if result, err := n.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.NoticeSetting), nil
}
}
func (n noticeSettingDo) Take() (*model.NoticeSetting, error) {
if result, err := n.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.NoticeSetting), nil
}
}
func (n noticeSettingDo) Last() (*model.NoticeSetting, error) {
if result, err := n.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.NoticeSetting), nil
}
}
func (n noticeSettingDo) Find() ([]*model.NoticeSetting, error) {
result, err := n.DO.Find()
return result.([]*model.NoticeSetting), err
}
func (n noticeSettingDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.NoticeSetting, err error) {
buf := make([]*model.NoticeSetting, 0, batchSize)
err = n.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (n noticeSettingDo) FindInBatches(result *[]*model.NoticeSetting, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return n.DO.FindInBatches(result, batchSize, fc)
}
func (n noticeSettingDo) Attrs(attrs ...field.AssignExpr) INoticeSettingDo {
return n.withDO(n.DO.Attrs(attrs...))
}
func (n noticeSettingDo) Assign(attrs ...field.AssignExpr) INoticeSettingDo {
return n.withDO(n.DO.Assign(attrs...))
}
func (n noticeSettingDo) Joins(fields ...field.RelationField) INoticeSettingDo {
for _, _f := range fields {
n = *n.withDO(n.DO.Joins(_f))
}
return &n
}
func (n noticeSettingDo) Preload(fields ...field.RelationField) INoticeSettingDo {
for _, _f := range fields {
n = *n.withDO(n.DO.Preload(_f))
}
return &n
}
func (n noticeSettingDo) FirstOrInit() (*model.NoticeSetting, error) {
if result, err := n.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.NoticeSetting), nil
}
}
func (n noticeSettingDo) FirstOrCreate() (*model.NoticeSetting, error) {
if result, err := n.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.NoticeSetting), nil
}
}
func (n noticeSettingDo) FindByPage(offset int, limit int) (result []*model.NoticeSetting, count int64, err error) {
result, err = n.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = n.Offset(-1).Limit(-1).Count()
return
}
func (n noticeSettingDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = n.Count()
if err != nil {
return
}
err = n.Offset(offset).Limit(limit).Scan(result)
return
}
func (n noticeSettingDo) Scan(result interface{}) (err error) {
return n.DO.Scan(result)
}
func (n noticeSettingDo) Delete(models ...*model.NoticeSetting) (result gen.ResultInfo, err error) {
return n.DO.Delete(models)
}
func (n *noticeSettingDo) withDO(do gen.Dao) *noticeSettingDo {
n.DO = *do.(*gen.DO)
return n
}

View File

@@ -0,0 +1,518 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"likeadmin/model"
)
func newRechargeOrder(db *gorm.DB, opts ...gen.DOOption) rechargeOrder {
_rechargeOrder := rechargeOrder{}
_rechargeOrder.rechargeOrderDo.UseDB(db, opts...)
_rechargeOrder.rechargeOrderDo.UseModel(&model.RechargeOrder{})
tableName := _rechargeOrder.rechargeOrderDo.TableName()
_rechargeOrder.ALL = field.NewAsterisk(tableName)
_rechargeOrder.ID = field.NewInt32(tableName, "id")
_rechargeOrder.Sn = field.NewString(tableName, "sn")
_rechargeOrder.UserID = field.NewInt32(tableName, "user_id")
_rechargeOrder.UserSn = field.NewInt32(tableName, "user_sn")
_rechargeOrder.Mobile = field.NewString(tableName, "mobile")
_rechargeOrder.PaySn = field.NewString(tableName, "pay_sn")
_rechargeOrder.PayWay = field.NewInt32(tableName, "pay_way")
_rechargeOrder.PayStatus = field.NewInt32(tableName, "pay_status")
_rechargeOrder.PayTime = field.NewInt32(tableName, "pay_time")
_rechargeOrder.OrderAmount = field.NewFloat64(tableName, "order_amount")
_rechargeOrder.OrderTerminal = field.NewInt32(tableName, "order_terminal")
_rechargeOrder.TransactionID = field.NewString(tableName, "transaction_id")
_rechargeOrder.RefundStatus = field.NewInt32(tableName, "refund_status")
_rechargeOrder.CreateTime = field.NewInt32(tableName, "create_time")
_rechargeOrder.UpdateTime = field.NewInt32(tableName, "update_time")
_rechargeOrder.DeleteTime = field.NewInt32(tableName, "delete_time")
_rechargeOrder.User = rechargeOrderBelongsToUser{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("User", "model.User"),
}
_rechargeOrder.fillFieldMap()
return _rechargeOrder
}
type rechargeOrder struct {
rechargeOrderDo
ALL field.Asterisk
ID field.Int32 // id
Sn field.String // 订单编号
UserID field.Int32 // 用户id
UserSn field.Int32 // 用户编号
Mobile field.String
PaySn field.String // 支付编号-冗余字段,针对微信同一主体不同客户端支付需用不同订单号预留。
PayWay field.Int32 // 支付方式 2-微信支付 3-支付宝支付
PayStatus field.Int32 // 支付状态2-待支付1-已支付
PayTime field.Int32 // 支付时间
OrderAmount field.Float64 // 充值金额
OrderTerminal field.Int32 // 终端
TransactionID field.String // 第三方平台交易流水号
RefundStatus field.Int32 // 退款状态 0-未退款 1-已退款
CreateTime field.Int32 // 创建时间
UpdateTime field.Int32 // 更新时间
DeleteTime field.Int32 // 删除时间
User rechargeOrderBelongsToUser
fieldMap map[string]field.Expr
}
func (r rechargeOrder) Table(newTableName string) *rechargeOrder {
r.rechargeOrderDo.UseTable(newTableName)
return r.updateTableName(newTableName)
}
func (r rechargeOrder) As(alias string) *rechargeOrder {
r.rechargeOrderDo.DO = *(r.rechargeOrderDo.As(alias).(*gen.DO))
return r.updateTableName(alias)
}
func (r *rechargeOrder) updateTableName(table string) *rechargeOrder {
r.ALL = field.NewAsterisk(table)
r.ID = field.NewInt32(table, "id")
r.Sn = field.NewString(table, "sn")
r.UserID = field.NewInt32(table, "user_id")
r.UserSn = field.NewInt32(table, "user_sn")
r.Mobile = field.NewString(table, "mobile")
r.PaySn = field.NewString(table, "pay_sn")
r.PayWay = field.NewInt32(table, "pay_way")
r.PayStatus = field.NewInt32(table, "pay_status")
r.PayTime = field.NewInt32(table, "pay_time")
r.OrderAmount = field.NewFloat64(table, "order_amount")
r.OrderTerminal = field.NewInt32(table, "order_terminal")
r.TransactionID = field.NewString(table, "transaction_id")
r.RefundStatus = field.NewInt32(table, "refund_status")
r.CreateTime = field.NewInt32(table, "create_time")
r.UpdateTime = field.NewInt32(table, "update_time")
r.DeleteTime = field.NewInt32(table, "delete_time")
r.fillFieldMap()
return r
}
func (r *rechargeOrder) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := r.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (r *rechargeOrder) fillFieldMap() {
r.fieldMap = make(map[string]field.Expr, 17)
r.fieldMap["id"] = r.ID
r.fieldMap["sn"] = r.Sn
r.fieldMap["user_id"] = r.UserID
r.fieldMap["user_sn"] = r.UserSn
r.fieldMap["mobile"] = r.Mobile
r.fieldMap["pay_sn"] = r.PaySn
r.fieldMap["pay_way"] = r.PayWay
r.fieldMap["pay_status"] = r.PayStatus
r.fieldMap["pay_time"] = r.PayTime
r.fieldMap["order_amount"] = r.OrderAmount
r.fieldMap["order_terminal"] = r.OrderTerminal
r.fieldMap["transaction_id"] = r.TransactionID
r.fieldMap["refund_status"] = r.RefundStatus
r.fieldMap["create_time"] = r.CreateTime
r.fieldMap["update_time"] = r.UpdateTime
r.fieldMap["delete_time"] = r.DeleteTime
}
func (r rechargeOrder) clone(db *gorm.DB) rechargeOrder {
r.rechargeOrderDo.ReplaceConnPool(db.Statement.ConnPool)
return r
}
func (r rechargeOrder) replaceDB(db *gorm.DB) rechargeOrder {
r.rechargeOrderDo.ReplaceDB(db)
return r
}
type rechargeOrderBelongsToUser struct {
db *gorm.DB
field.RelationField
}
func (a rechargeOrderBelongsToUser) Where(conds ...field.Expr) *rechargeOrderBelongsToUser {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a rechargeOrderBelongsToUser) WithContext(ctx context.Context) *rechargeOrderBelongsToUser {
a.db = a.db.WithContext(ctx)
return &a
}
func (a rechargeOrderBelongsToUser) Session(session *gorm.Session) *rechargeOrderBelongsToUser {
a.db = a.db.Session(session)
return &a
}
func (a rechargeOrderBelongsToUser) Model(m *model.RechargeOrder) *rechargeOrderBelongsToUserTx {
return &rechargeOrderBelongsToUserTx{a.db.Model(m).Association(a.Name())}
}
type rechargeOrderBelongsToUserTx struct{ tx *gorm.Association }
func (a rechargeOrderBelongsToUserTx) Find() (result *model.User, err error) {
return result, a.tx.Find(&result)
}
func (a rechargeOrderBelongsToUserTx) Append(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a rechargeOrderBelongsToUserTx) Replace(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a rechargeOrderBelongsToUserTx) Delete(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a rechargeOrderBelongsToUserTx) Clear() error {
return a.tx.Clear()
}
func (a rechargeOrderBelongsToUserTx) Count() int64 {
return a.tx.Count()
}
type rechargeOrderDo struct{ gen.DO }
type IRechargeOrderDo interface {
gen.SubQuery
Debug() IRechargeOrderDo
WithContext(ctx context.Context) IRechargeOrderDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IRechargeOrderDo
WriteDB() IRechargeOrderDo
As(alias string) gen.Dao
Session(config *gorm.Session) IRechargeOrderDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IRechargeOrderDo
Not(conds ...gen.Condition) IRechargeOrderDo
Or(conds ...gen.Condition) IRechargeOrderDo
Select(conds ...field.Expr) IRechargeOrderDo
Where(conds ...gen.Condition) IRechargeOrderDo
Order(conds ...field.Expr) IRechargeOrderDo
Distinct(cols ...field.Expr) IRechargeOrderDo
Omit(cols ...field.Expr) IRechargeOrderDo
Join(table schema.Tabler, on ...field.Expr) IRechargeOrderDo
LeftJoin(table schema.Tabler, on ...field.Expr) IRechargeOrderDo
RightJoin(table schema.Tabler, on ...field.Expr) IRechargeOrderDo
Group(cols ...field.Expr) IRechargeOrderDo
Having(conds ...gen.Condition) IRechargeOrderDo
Limit(limit int) IRechargeOrderDo
Offset(offset int) IRechargeOrderDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IRechargeOrderDo
Unscoped() IRechargeOrderDo
Create(values ...*model.RechargeOrder) error
CreateInBatches(values []*model.RechargeOrder, batchSize int) error
Save(values ...*model.RechargeOrder) error
First() (*model.RechargeOrder, error)
Take() (*model.RechargeOrder, error)
Last() (*model.RechargeOrder, error)
Find() ([]*model.RechargeOrder, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.RechargeOrder, err error)
FindInBatches(result *[]*model.RechargeOrder, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*model.RechargeOrder) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IRechargeOrderDo
Assign(attrs ...field.AssignExpr) IRechargeOrderDo
Joins(fields ...field.RelationField) IRechargeOrderDo
Preload(fields ...field.RelationField) IRechargeOrderDo
FirstOrInit() (*model.RechargeOrder, error)
FirstOrCreate() (*model.RechargeOrder, error)
FindByPage(offset int, limit int) (result []*model.RechargeOrder, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IRechargeOrderDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (r rechargeOrderDo) Debug() IRechargeOrderDo {
return r.withDO(r.DO.Debug())
}
func (r rechargeOrderDo) WithContext(ctx context.Context) IRechargeOrderDo {
return r.withDO(r.DO.WithContext(ctx))
}
func (r rechargeOrderDo) ReadDB() IRechargeOrderDo {
return r.Clauses(dbresolver.Read)
}
func (r rechargeOrderDo) WriteDB() IRechargeOrderDo {
return r.Clauses(dbresolver.Write)
}
func (r rechargeOrderDo) Session(config *gorm.Session) IRechargeOrderDo {
return r.withDO(r.DO.Session(config))
}
func (r rechargeOrderDo) Clauses(conds ...clause.Expression) IRechargeOrderDo {
return r.withDO(r.DO.Clauses(conds...))
}
func (r rechargeOrderDo) Returning(value interface{}, columns ...string) IRechargeOrderDo {
return r.withDO(r.DO.Returning(value, columns...))
}
func (r rechargeOrderDo) Not(conds ...gen.Condition) IRechargeOrderDo {
return r.withDO(r.DO.Not(conds...))
}
func (r rechargeOrderDo) Or(conds ...gen.Condition) IRechargeOrderDo {
return r.withDO(r.DO.Or(conds...))
}
func (r rechargeOrderDo) Select(conds ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.Select(conds...))
}
func (r rechargeOrderDo) Where(conds ...gen.Condition) IRechargeOrderDo {
return r.withDO(r.DO.Where(conds...))
}
func (r rechargeOrderDo) Order(conds ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.Order(conds...))
}
func (r rechargeOrderDo) Distinct(cols ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.Distinct(cols...))
}
func (r rechargeOrderDo) Omit(cols ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.Omit(cols...))
}
func (r rechargeOrderDo) Join(table schema.Tabler, on ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.Join(table, on...))
}
func (r rechargeOrderDo) LeftJoin(table schema.Tabler, on ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.LeftJoin(table, on...))
}
func (r rechargeOrderDo) RightJoin(table schema.Tabler, on ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.RightJoin(table, on...))
}
func (r rechargeOrderDo) Group(cols ...field.Expr) IRechargeOrderDo {
return r.withDO(r.DO.Group(cols...))
}
func (r rechargeOrderDo) Having(conds ...gen.Condition) IRechargeOrderDo {
return r.withDO(r.DO.Having(conds...))
}
func (r rechargeOrderDo) Limit(limit int) IRechargeOrderDo {
return r.withDO(r.DO.Limit(limit))
}
func (r rechargeOrderDo) Offset(offset int) IRechargeOrderDo {
return r.withDO(r.DO.Offset(offset))
}
func (r rechargeOrderDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IRechargeOrderDo {
return r.withDO(r.DO.Scopes(funcs...))
}
func (r rechargeOrderDo) Unscoped() IRechargeOrderDo {
return r.withDO(r.DO.Unscoped())
}
func (r rechargeOrderDo) Create(values ...*model.RechargeOrder) error {
if len(values) == 0 {
return nil
}
return r.DO.Create(values)
}
func (r rechargeOrderDo) CreateInBatches(values []*model.RechargeOrder, batchSize int) error {
return r.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (r rechargeOrderDo) Save(values ...*model.RechargeOrder) error {
if len(values) == 0 {
return nil
}
return r.DO.Save(values)
}
func (r rechargeOrderDo) First() (*model.RechargeOrder, error) {
if result, err := r.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.RechargeOrder), nil
}
}
func (r rechargeOrderDo) Take() (*model.RechargeOrder, error) {
if result, err := r.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.RechargeOrder), nil
}
}
func (r rechargeOrderDo) Last() (*model.RechargeOrder, error) {
if result, err := r.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.RechargeOrder), nil
}
}
func (r rechargeOrderDo) Find() ([]*model.RechargeOrder, error) {
result, err := r.DO.Find()
return result.([]*model.RechargeOrder), err
}
func (r rechargeOrderDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.RechargeOrder, err error) {
buf := make([]*model.RechargeOrder, 0, batchSize)
err = r.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (r rechargeOrderDo) FindInBatches(result *[]*model.RechargeOrder, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return r.DO.FindInBatches(result, batchSize, fc)
}
func (r rechargeOrderDo) Attrs(attrs ...field.AssignExpr) IRechargeOrderDo {
return r.withDO(r.DO.Attrs(attrs...))
}
func (r rechargeOrderDo) Assign(attrs ...field.AssignExpr) IRechargeOrderDo {
return r.withDO(r.DO.Assign(attrs...))
}
func (r rechargeOrderDo) Joins(fields ...field.RelationField) IRechargeOrderDo {
for _, _f := range fields {
r = *r.withDO(r.DO.Joins(_f))
}
return &r
}
func (r rechargeOrderDo) Preload(fields ...field.RelationField) IRechargeOrderDo {
for _, _f := range fields {
r = *r.withDO(r.DO.Preload(_f))
}
return &r
}
func (r rechargeOrderDo) FirstOrInit() (*model.RechargeOrder, error) {
if result, err := r.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.RechargeOrder), nil
}
}
func (r rechargeOrderDo) FirstOrCreate() (*model.RechargeOrder, error) {
if result, err := r.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.RechargeOrder), nil
}
}
func (r rechargeOrderDo) FindByPage(offset int, limit int) (result []*model.RechargeOrder, count int64, err error) {
result, err = r.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = r.Offset(-1).Limit(-1).Count()
return
}
func (r rechargeOrderDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = r.Count()
if err != nil {
return
}
err = r.Offset(offset).Limit(limit).Scan(result)
return
}
func (r rechargeOrderDo) Scan(result interface{}) (err error) {
return r.DO.Scan(result)
}
func (r rechargeOrderDo) Delete(models ...*model.RechargeOrder) (result gen.ResultInfo, err error) {
return r.DO.Delete(models)
}
func (r *rechargeOrderDo) withDO(do gen.Dao) *rechargeOrderDo {
r.DO = *do.(*gen.DO)
return r
}

View File

@@ -0,0 +1,498 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"likeadmin/model"
)
func newRefundLog(db *gorm.DB, opts ...gen.DOOption) refundLog {
_refundLog := refundLog{}
_refundLog.refundLogDo.UseDB(db, opts...)
_refundLog.refundLogDo.UseModel(&model.RefundLog{})
tableName := _refundLog.refundLogDo.TableName()
_refundLog.ALL = field.NewAsterisk(tableName)
_refundLog.ID = field.NewInt32(tableName, "id")
_refundLog.Sn = field.NewString(tableName, "sn")
_refundLog.RecordID = field.NewInt32(tableName, "record_id")
_refundLog.UserID = field.NewInt32(tableName, "user_id")
_refundLog.HandleID = field.NewInt32(tableName, "handle_id")
_refundLog.OrderAmount = field.NewFloat64(tableName, "order_amount")
_refundLog.RefundAmount = field.NewFloat64(tableName, "refund_amount")
_refundLog.RefundStatus = field.NewInt32(tableName, "refund_status")
_refundLog.RefundMsg = field.NewString(tableName, "refund_msg")
_refundLog.CreateTime = field.NewInt32(tableName, "create_time")
_refundLog.UpdateTime = field.NewInt32(tableName, "update_time")
_refundLog.Admin = refundLogBelongsToAdmin{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Admin", "model.SystemAuthAdmin"),
}
_refundLog.fillFieldMap()
return _refundLog
}
type refundLog struct {
refundLogDo
ALL field.Asterisk
ID field.Int32 // id
Sn field.String // 编号
RecordID field.Int32 // 退款记录id
UserID field.Int32 // 关联用户
HandleID field.Int32 // 处理人id管理员id
OrderAmount field.Float64 // 订单总的应付款金额,冗余字段
RefundAmount field.Float64 // 本次退款金额
RefundStatus field.Int32 // 退款状态0退款中1退款成功2退款失败
RefundMsg field.String // 退款信息
CreateTime field.Int32 // 创建时间
UpdateTime field.Int32 // 更新时间
Admin refundLogBelongsToAdmin
fieldMap map[string]field.Expr
}
func (r refundLog) Table(newTableName string) *refundLog {
r.refundLogDo.UseTable(newTableName)
return r.updateTableName(newTableName)
}
func (r refundLog) As(alias string) *refundLog {
r.refundLogDo.DO = *(r.refundLogDo.As(alias).(*gen.DO))
return r.updateTableName(alias)
}
func (r *refundLog) updateTableName(table string) *refundLog {
r.ALL = field.NewAsterisk(table)
r.ID = field.NewInt32(table, "id")
r.Sn = field.NewString(table, "sn")
r.RecordID = field.NewInt32(table, "record_id")
r.UserID = field.NewInt32(table, "user_id")
r.HandleID = field.NewInt32(table, "handle_id")
r.OrderAmount = field.NewFloat64(table, "order_amount")
r.RefundAmount = field.NewFloat64(table, "refund_amount")
r.RefundStatus = field.NewInt32(table, "refund_status")
r.RefundMsg = field.NewString(table, "refund_msg")
r.CreateTime = field.NewInt32(table, "create_time")
r.UpdateTime = field.NewInt32(table, "update_time")
r.fillFieldMap()
return r
}
func (r *refundLog) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := r.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (r *refundLog) fillFieldMap() {
r.fieldMap = make(map[string]field.Expr, 12)
r.fieldMap["id"] = r.ID
r.fieldMap["sn"] = r.Sn
r.fieldMap["record_id"] = r.RecordID
r.fieldMap["user_id"] = r.UserID
r.fieldMap["handle_id"] = r.HandleID
r.fieldMap["order_amount"] = r.OrderAmount
r.fieldMap["refund_amount"] = r.RefundAmount
r.fieldMap["refund_status"] = r.RefundStatus
r.fieldMap["refund_msg"] = r.RefundMsg
r.fieldMap["create_time"] = r.CreateTime
r.fieldMap["update_time"] = r.UpdateTime
}
func (r refundLog) clone(db *gorm.DB) refundLog {
r.refundLogDo.ReplaceConnPool(db.Statement.ConnPool)
return r
}
func (r refundLog) replaceDB(db *gorm.DB) refundLog {
r.refundLogDo.ReplaceDB(db)
return r
}
type refundLogBelongsToAdmin struct {
db *gorm.DB
field.RelationField
}
func (a refundLogBelongsToAdmin) Where(conds ...field.Expr) *refundLogBelongsToAdmin {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a refundLogBelongsToAdmin) WithContext(ctx context.Context) *refundLogBelongsToAdmin {
a.db = a.db.WithContext(ctx)
return &a
}
func (a refundLogBelongsToAdmin) Session(session *gorm.Session) *refundLogBelongsToAdmin {
a.db = a.db.Session(session)
return &a
}
func (a refundLogBelongsToAdmin) Model(m *model.RefundLog) *refundLogBelongsToAdminTx {
return &refundLogBelongsToAdminTx{a.db.Model(m).Association(a.Name())}
}
type refundLogBelongsToAdminTx struct{ tx *gorm.Association }
func (a refundLogBelongsToAdminTx) Find() (result *model.SystemAuthAdmin, err error) {
return result, a.tx.Find(&result)
}
func (a refundLogBelongsToAdminTx) Append(values ...*model.SystemAuthAdmin) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a refundLogBelongsToAdminTx) Replace(values ...*model.SystemAuthAdmin) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a refundLogBelongsToAdminTx) Delete(values ...*model.SystemAuthAdmin) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a refundLogBelongsToAdminTx) Clear() error {
return a.tx.Clear()
}
func (a refundLogBelongsToAdminTx) Count() int64 {
return a.tx.Count()
}
type refundLogDo struct{ gen.DO }
type IRefundLogDo interface {
gen.SubQuery
Debug() IRefundLogDo
WithContext(ctx context.Context) IRefundLogDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IRefundLogDo
WriteDB() IRefundLogDo
As(alias string) gen.Dao
Session(config *gorm.Session) IRefundLogDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IRefundLogDo
Not(conds ...gen.Condition) IRefundLogDo
Or(conds ...gen.Condition) IRefundLogDo
Select(conds ...field.Expr) IRefundLogDo
Where(conds ...gen.Condition) IRefundLogDo
Order(conds ...field.Expr) IRefundLogDo
Distinct(cols ...field.Expr) IRefundLogDo
Omit(cols ...field.Expr) IRefundLogDo
Join(table schema.Tabler, on ...field.Expr) IRefundLogDo
LeftJoin(table schema.Tabler, on ...field.Expr) IRefundLogDo
RightJoin(table schema.Tabler, on ...field.Expr) IRefundLogDo
Group(cols ...field.Expr) IRefundLogDo
Having(conds ...gen.Condition) IRefundLogDo
Limit(limit int) IRefundLogDo
Offset(offset int) IRefundLogDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IRefundLogDo
Unscoped() IRefundLogDo
Create(values ...*model.RefundLog) error
CreateInBatches(values []*model.RefundLog, batchSize int) error
Save(values ...*model.RefundLog) error
First() (*model.RefundLog, error)
Take() (*model.RefundLog, error)
Last() (*model.RefundLog, error)
Find() ([]*model.RefundLog, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.RefundLog, err error)
FindInBatches(result *[]*model.RefundLog, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*model.RefundLog) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IRefundLogDo
Assign(attrs ...field.AssignExpr) IRefundLogDo
Joins(fields ...field.RelationField) IRefundLogDo
Preload(fields ...field.RelationField) IRefundLogDo
FirstOrInit() (*model.RefundLog, error)
FirstOrCreate() (*model.RefundLog, error)
FindByPage(offset int, limit int) (result []*model.RefundLog, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IRefundLogDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (r refundLogDo) Debug() IRefundLogDo {
return r.withDO(r.DO.Debug())
}
func (r refundLogDo) WithContext(ctx context.Context) IRefundLogDo {
return r.withDO(r.DO.WithContext(ctx))
}
func (r refundLogDo) ReadDB() IRefundLogDo {
return r.Clauses(dbresolver.Read)
}
func (r refundLogDo) WriteDB() IRefundLogDo {
return r.Clauses(dbresolver.Write)
}
func (r refundLogDo) Session(config *gorm.Session) IRefundLogDo {
return r.withDO(r.DO.Session(config))
}
func (r refundLogDo) Clauses(conds ...clause.Expression) IRefundLogDo {
return r.withDO(r.DO.Clauses(conds...))
}
func (r refundLogDo) Returning(value interface{}, columns ...string) IRefundLogDo {
return r.withDO(r.DO.Returning(value, columns...))
}
func (r refundLogDo) Not(conds ...gen.Condition) IRefundLogDo {
return r.withDO(r.DO.Not(conds...))
}
func (r refundLogDo) Or(conds ...gen.Condition) IRefundLogDo {
return r.withDO(r.DO.Or(conds...))
}
func (r refundLogDo) Select(conds ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.Select(conds...))
}
func (r refundLogDo) Where(conds ...gen.Condition) IRefundLogDo {
return r.withDO(r.DO.Where(conds...))
}
func (r refundLogDo) Order(conds ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.Order(conds...))
}
func (r refundLogDo) Distinct(cols ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.Distinct(cols...))
}
func (r refundLogDo) Omit(cols ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.Omit(cols...))
}
func (r refundLogDo) Join(table schema.Tabler, on ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.Join(table, on...))
}
func (r refundLogDo) LeftJoin(table schema.Tabler, on ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.LeftJoin(table, on...))
}
func (r refundLogDo) RightJoin(table schema.Tabler, on ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.RightJoin(table, on...))
}
func (r refundLogDo) Group(cols ...field.Expr) IRefundLogDo {
return r.withDO(r.DO.Group(cols...))
}
func (r refundLogDo) Having(conds ...gen.Condition) IRefundLogDo {
return r.withDO(r.DO.Having(conds...))
}
func (r refundLogDo) Limit(limit int) IRefundLogDo {
return r.withDO(r.DO.Limit(limit))
}
func (r refundLogDo) Offset(offset int) IRefundLogDo {
return r.withDO(r.DO.Offset(offset))
}
func (r refundLogDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IRefundLogDo {
return r.withDO(r.DO.Scopes(funcs...))
}
func (r refundLogDo) Unscoped() IRefundLogDo {
return r.withDO(r.DO.Unscoped())
}
func (r refundLogDo) Create(values ...*model.RefundLog) error {
if len(values) == 0 {
return nil
}
return r.DO.Create(values)
}
func (r refundLogDo) CreateInBatches(values []*model.RefundLog, batchSize int) error {
return r.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (r refundLogDo) Save(values ...*model.RefundLog) error {
if len(values) == 0 {
return nil
}
return r.DO.Save(values)
}
func (r refundLogDo) First() (*model.RefundLog, error) {
if result, err := r.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.RefundLog), nil
}
}
func (r refundLogDo) Take() (*model.RefundLog, error) {
if result, err := r.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.RefundLog), nil
}
}
func (r refundLogDo) Last() (*model.RefundLog, error) {
if result, err := r.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.RefundLog), nil
}
}
func (r refundLogDo) Find() ([]*model.RefundLog, error) {
result, err := r.DO.Find()
return result.([]*model.RefundLog), err
}
func (r refundLogDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.RefundLog, err error) {
buf := make([]*model.RefundLog, 0, batchSize)
err = r.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (r refundLogDo) FindInBatches(result *[]*model.RefundLog, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return r.DO.FindInBatches(result, batchSize, fc)
}
func (r refundLogDo) Attrs(attrs ...field.AssignExpr) IRefundLogDo {
return r.withDO(r.DO.Attrs(attrs...))
}
func (r refundLogDo) Assign(attrs ...field.AssignExpr) IRefundLogDo {
return r.withDO(r.DO.Assign(attrs...))
}
func (r refundLogDo) Joins(fields ...field.RelationField) IRefundLogDo {
for _, _f := range fields {
r = *r.withDO(r.DO.Joins(_f))
}
return &r
}
func (r refundLogDo) Preload(fields ...field.RelationField) IRefundLogDo {
for _, _f := range fields {
r = *r.withDO(r.DO.Preload(_f))
}
return &r
}
func (r refundLogDo) FirstOrInit() (*model.RefundLog, error) {
if result, err := r.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.RefundLog), nil
}
}
func (r refundLogDo) FirstOrCreate() (*model.RefundLog, error) {
if result, err := r.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.RefundLog), nil
}
}
func (r refundLogDo) FindByPage(offset int, limit int) (result []*model.RefundLog, count int64, err error) {
result, err = r.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = r.Offset(-1).Limit(-1).Count()
return
}
func (r refundLogDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = r.Count()
if err != nil {
return
}
err = r.Offset(offset).Limit(limit).Scan(result)
return
}
func (r refundLogDo) Scan(result interface{}) (err error) {
return r.DO.Scan(result)
}
func (r refundLogDo) Delete(models ...*model.RefundLog) (result gen.ResultInfo, err error) {
return r.DO.Delete(models)
}
func (r *refundLogDo) withDO(do gen.Dao) *refundLogDo {
r.DO = *do.(*gen.DO)
return r
}

View File

@@ -0,0 +1,514 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"likeadmin/model"
)
func newRefundRecord(db *gorm.DB, opts ...gen.DOOption) refundRecord {
_refundRecord := refundRecord{}
_refundRecord.refundRecordDo.UseDB(db, opts...)
_refundRecord.refundRecordDo.UseModel(&model.RefundRecord{})
tableName := _refundRecord.refundRecordDo.TableName()
_refundRecord.ALL = field.NewAsterisk(tableName)
_refundRecord.ID = field.NewInt32(tableName, "id")
_refundRecord.Sn = field.NewString(tableName, "sn")
_refundRecord.UserID = field.NewInt32(tableName, "user_id")
_refundRecord.UserSn = field.NewInt64(tableName, "user_sn")
_refundRecord.OrderID = field.NewInt32(tableName, "order_id")
_refundRecord.OrderSn = field.NewString(tableName, "order_sn")
_refundRecord.OrderType = field.NewString(tableName, "order_type")
_refundRecord.OrderAmount = field.NewFloat64(tableName, "order_amount")
_refundRecord.RefundAmount = field.NewFloat64(tableName, "refund_amount")
_refundRecord.TransactionID = field.NewString(tableName, "transaction_id")
_refundRecord.RefundWay = field.NewInt32(tableName, "refund_way")
_refundRecord.RefundType = field.NewInt32(tableName, "refund_type")
_refundRecord.RefundStatus = field.NewInt32(tableName, "refund_status")
_refundRecord.CreateTime = field.NewInt32(tableName, "create_time")
_refundRecord.UpdateTime = field.NewInt32(tableName, "update_time")
_refundRecord.User = refundRecordBelongsToUser{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("User", "model.User"),
}
_refundRecord.fillFieldMap()
return _refundRecord
}
type refundRecord struct {
refundRecordDo
ALL field.Asterisk
ID field.Int32 // id
Sn field.String // 退款编号
UserID field.Int32 // 关联用户
UserSn field.Int64
OrderID field.Int32 // 来源订单id
OrderSn field.String // 来源单号
OrderType field.String // 订单来源 order-商品订单 recharge-充值订单
OrderAmount field.Float64 // 订单总的应付款金额,冗余字段
RefundAmount field.Float64 // 本次退款金额
TransactionID field.String // 第三方平台交易流水号
RefundWay field.Int32 // 退款方式 1-线上退款 2-线下退款
RefundType field.Int32 // 退款类型 1-后台退款
RefundStatus field.Int32 // 退款状态0退款中1退款成功2退款失败
CreateTime field.Int32 // 创建时间
UpdateTime field.Int32 // 更新时间
User refundRecordBelongsToUser
fieldMap map[string]field.Expr
}
func (r refundRecord) Table(newTableName string) *refundRecord {
r.refundRecordDo.UseTable(newTableName)
return r.updateTableName(newTableName)
}
func (r refundRecord) As(alias string) *refundRecord {
r.refundRecordDo.DO = *(r.refundRecordDo.As(alias).(*gen.DO))
return r.updateTableName(alias)
}
func (r *refundRecord) updateTableName(table string) *refundRecord {
r.ALL = field.NewAsterisk(table)
r.ID = field.NewInt32(table, "id")
r.Sn = field.NewString(table, "sn")
r.UserID = field.NewInt32(table, "user_id")
r.UserSn = field.NewInt64(table, "user_sn")
r.OrderID = field.NewInt32(table, "order_id")
r.OrderSn = field.NewString(table, "order_sn")
r.OrderType = field.NewString(table, "order_type")
r.OrderAmount = field.NewFloat64(table, "order_amount")
r.RefundAmount = field.NewFloat64(table, "refund_amount")
r.TransactionID = field.NewString(table, "transaction_id")
r.RefundWay = field.NewInt32(table, "refund_way")
r.RefundType = field.NewInt32(table, "refund_type")
r.RefundStatus = field.NewInt32(table, "refund_status")
r.CreateTime = field.NewInt32(table, "create_time")
r.UpdateTime = field.NewInt32(table, "update_time")
r.fillFieldMap()
return r
}
func (r *refundRecord) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := r.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (r *refundRecord) fillFieldMap() {
r.fieldMap = make(map[string]field.Expr, 16)
r.fieldMap["id"] = r.ID
r.fieldMap["sn"] = r.Sn
r.fieldMap["user_id"] = r.UserID
r.fieldMap["user_sn"] = r.UserSn
r.fieldMap["order_id"] = r.OrderID
r.fieldMap["order_sn"] = r.OrderSn
r.fieldMap["order_type"] = r.OrderType
r.fieldMap["order_amount"] = r.OrderAmount
r.fieldMap["refund_amount"] = r.RefundAmount
r.fieldMap["transaction_id"] = r.TransactionID
r.fieldMap["refund_way"] = r.RefundWay
r.fieldMap["refund_type"] = r.RefundType
r.fieldMap["refund_status"] = r.RefundStatus
r.fieldMap["create_time"] = r.CreateTime
r.fieldMap["update_time"] = r.UpdateTime
}
func (r refundRecord) clone(db *gorm.DB) refundRecord {
r.refundRecordDo.ReplaceConnPool(db.Statement.ConnPool)
return r
}
func (r refundRecord) replaceDB(db *gorm.DB) refundRecord {
r.refundRecordDo.ReplaceDB(db)
return r
}
type refundRecordBelongsToUser struct {
db *gorm.DB
field.RelationField
}
func (a refundRecordBelongsToUser) Where(conds ...field.Expr) *refundRecordBelongsToUser {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a refundRecordBelongsToUser) WithContext(ctx context.Context) *refundRecordBelongsToUser {
a.db = a.db.WithContext(ctx)
return &a
}
func (a refundRecordBelongsToUser) Session(session *gorm.Session) *refundRecordBelongsToUser {
a.db = a.db.Session(session)
return &a
}
func (a refundRecordBelongsToUser) Model(m *model.RefundRecord) *refundRecordBelongsToUserTx {
return &refundRecordBelongsToUserTx{a.db.Model(m).Association(a.Name())}
}
type refundRecordBelongsToUserTx struct{ tx *gorm.Association }
func (a refundRecordBelongsToUserTx) Find() (result *model.User, err error) {
return result, a.tx.Find(&result)
}
func (a refundRecordBelongsToUserTx) Append(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a refundRecordBelongsToUserTx) Replace(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a refundRecordBelongsToUserTx) Delete(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a refundRecordBelongsToUserTx) Clear() error {
return a.tx.Clear()
}
func (a refundRecordBelongsToUserTx) Count() int64 {
return a.tx.Count()
}
type refundRecordDo struct{ gen.DO }
type IRefundRecordDo interface {
gen.SubQuery
Debug() IRefundRecordDo
WithContext(ctx context.Context) IRefundRecordDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() IRefundRecordDo
WriteDB() IRefundRecordDo
As(alias string) gen.Dao
Session(config *gorm.Session) IRefundRecordDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) IRefundRecordDo
Not(conds ...gen.Condition) IRefundRecordDo
Or(conds ...gen.Condition) IRefundRecordDo
Select(conds ...field.Expr) IRefundRecordDo
Where(conds ...gen.Condition) IRefundRecordDo
Order(conds ...field.Expr) IRefundRecordDo
Distinct(cols ...field.Expr) IRefundRecordDo
Omit(cols ...field.Expr) IRefundRecordDo
Join(table schema.Tabler, on ...field.Expr) IRefundRecordDo
LeftJoin(table schema.Tabler, on ...field.Expr) IRefundRecordDo
RightJoin(table schema.Tabler, on ...field.Expr) IRefundRecordDo
Group(cols ...field.Expr) IRefundRecordDo
Having(conds ...gen.Condition) IRefundRecordDo
Limit(limit int) IRefundRecordDo
Offset(offset int) IRefundRecordDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) IRefundRecordDo
Unscoped() IRefundRecordDo
Create(values ...*model.RefundRecord) error
CreateInBatches(values []*model.RefundRecord, batchSize int) error
Save(values ...*model.RefundRecord) error
First() (*model.RefundRecord, error)
Take() (*model.RefundRecord, error)
Last() (*model.RefundRecord, error)
Find() ([]*model.RefundRecord, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.RefundRecord, err error)
FindInBatches(result *[]*model.RefundRecord, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*model.RefundRecord) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) IRefundRecordDo
Assign(attrs ...field.AssignExpr) IRefundRecordDo
Joins(fields ...field.RelationField) IRefundRecordDo
Preload(fields ...field.RelationField) IRefundRecordDo
FirstOrInit() (*model.RefundRecord, error)
FirstOrCreate() (*model.RefundRecord, error)
FindByPage(offset int, limit int) (result []*model.RefundRecord, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) IRefundRecordDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (r refundRecordDo) Debug() IRefundRecordDo {
return r.withDO(r.DO.Debug())
}
func (r refundRecordDo) WithContext(ctx context.Context) IRefundRecordDo {
return r.withDO(r.DO.WithContext(ctx))
}
func (r refundRecordDo) ReadDB() IRefundRecordDo {
return r.Clauses(dbresolver.Read)
}
func (r refundRecordDo) WriteDB() IRefundRecordDo {
return r.Clauses(dbresolver.Write)
}
func (r refundRecordDo) Session(config *gorm.Session) IRefundRecordDo {
return r.withDO(r.DO.Session(config))
}
func (r refundRecordDo) Clauses(conds ...clause.Expression) IRefundRecordDo {
return r.withDO(r.DO.Clauses(conds...))
}
func (r refundRecordDo) Returning(value interface{}, columns ...string) IRefundRecordDo {
return r.withDO(r.DO.Returning(value, columns...))
}
func (r refundRecordDo) Not(conds ...gen.Condition) IRefundRecordDo {
return r.withDO(r.DO.Not(conds...))
}
func (r refundRecordDo) Or(conds ...gen.Condition) IRefundRecordDo {
return r.withDO(r.DO.Or(conds...))
}
func (r refundRecordDo) Select(conds ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.Select(conds...))
}
func (r refundRecordDo) Where(conds ...gen.Condition) IRefundRecordDo {
return r.withDO(r.DO.Where(conds...))
}
func (r refundRecordDo) Order(conds ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.Order(conds...))
}
func (r refundRecordDo) Distinct(cols ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.Distinct(cols...))
}
func (r refundRecordDo) Omit(cols ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.Omit(cols...))
}
func (r refundRecordDo) Join(table schema.Tabler, on ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.Join(table, on...))
}
func (r refundRecordDo) LeftJoin(table schema.Tabler, on ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.LeftJoin(table, on...))
}
func (r refundRecordDo) RightJoin(table schema.Tabler, on ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.RightJoin(table, on...))
}
func (r refundRecordDo) Group(cols ...field.Expr) IRefundRecordDo {
return r.withDO(r.DO.Group(cols...))
}
func (r refundRecordDo) Having(conds ...gen.Condition) IRefundRecordDo {
return r.withDO(r.DO.Having(conds...))
}
func (r refundRecordDo) Limit(limit int) IRefundRecordDo {
return r.withDO(r.DO.Limit(limit))
}
func (r refundRecordDo) Offset(offset int) IRefundRecordDo {
return r.withDO(r.DO.Offset(offset))
}
func (r refundRecordDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IRefundRecordDo {
return r.withDO(r.DO.Scopes(funcs...))
}
func (r refundRecordDo) Unscoped() IRefundRecordDo {
return r.withDO(r.DO.Unscoped())
}
func (r refundRecordDo) Create(values ...*model.RefundRecord) error {
if len(values) == 0 {
return nil
}
return r.DO.Create(values)
}
func (r refundRecordDo) CreateInBatches(values []*model.RefundRecord, batchSize int) error {
return r.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (r refundRecordDo) Save(values ...*model.RefundRecord) error {
if len(values) == 0 {
return nil
}
return r.DO.Save(values)
}
func (r refundRecordDo) First() (*model.RefundRecord, error) {
if result, err := r.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.RefundRecord), nil
}
}
func (r refundRecordDo) Take() (*model.RefundRecord, error) {
if result, err := r.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.RefundRecord), nil
}
}
func (r refundRecordDo) Last() (*model.RefundRecord, error) {
if result, err := r.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.RefundRecord), nil
}
}
func (r refundRecordDo) Find() ([]*model.RefundRecord, error) {
result, err := r.DO.Find()
return result.([]*model.RefundRecord), err
}
func (r refundRecordDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.RefundRecord, err error) {
buf := make([]*model.RefundRecord, 0, batchSize)
err = r.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (r refundRecordDo) FindInBatches(result *[]*model.RefundRecord, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return r.DO.FindInBatches(result, batchSize, fc)
}
func (r refundRecordDo) Attrs(attrs ...field.AssignExpr) IRefundRecordDo {
return r.withDO(r.DO.Attrs(attrs...))
}
func (r refundRecordDo) Assign(attrs ...field.AssignExpr) IRefundRecordDo {
return r.withDO(r.DO.Assign(attrs...))
}
func (r refundRecordDo) Joins(fields ...field.RelationField) IRefundRecordDo {
for _, _f := range fields {
r = *r.withDO(r.DO.Joins(_f))
}
return &r
}
func (r refundRecordDo) Preload(fields ...field.RelationField) IRefundRecordDo {
for _, _f := range fields {
r = *r.withDO(r.DO.Preload(_f))
}
return &r
}
func (r refundRecordDo) FirstOrInit() (*model.RefundRecord, error) {
if result, err := r.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.RefundRecord), nil
}
}
func (r refundRecordDo) FirstOrCreate() (*model.RefundRecord, error) {
if result, err := r.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.RefundRecord), nil
}
}
func (r refundRecordDo) FindByPage(offset int, limit int) (result []*model.RefundRecord, count int64, err error) {
result, err = r.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = r.Offset(-1).Limit(-1).Count()
return
}
func (r refundRecordDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = r.Count()
if err != nil {
return
}
err = r.Offset(offset).Limit(limit).Scan(result)
return
}
func (r refundRecordDo) Scan(result interface{}) (err error) {
return r.DO.Scan(result)
}
func (r refundRecordDo) Delete(models ...*model.RefundRecord) (result gen.ResultInfo, err error) {
return r.DO.Delete(models)
}
func (r *refundRecordDo) withDO(do gen.Dao) *refundRecordDo {
r.DO = *do.(*gen.DO)
return r
}

View File

@@ -0,0 +1,448 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package dao
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"likeadmin/model"
)
func newSystemAuthAdmin(db *gorm.DB, opts ...gen.DOOption) systemAuthAdmin {
_systemAuthAdmin := systemAuthAdmin{}
_systemAuthAdmin.systemAuthAdminDo.UseDB(db, opts...)
_systemAuthAdmin.systemAuthAdminDo.UseModel(&model.SystemAuthAdmin{})
tableName := _systemAuthAdmin.systemAuthAdminDo.TableName()
_systemAuthAdmin.ALL = field.NewAsterisk(tableName)
_systemAuthAdmin.ID = field.NewInt32(tableName, "id")
_systemAuthAdmin.DeptID = field.NewInt32(tableName, "dept_id")
_systemAuthAdmin.PostID = field.NewInt32(tableName, "post_id")
_systemAuthAdmin.Username = field.NewString(tableName, "username")
_systemAuthAdmin.Nickname = field.NewString(tableName, "nickname")
_systemAuthAdmin.Password = field.NewString(tableName, "password")
_systemAuthAdmin.Avatar = field.NewString(tableName, "avatar")
_systemAuthAdmin.Role = field.NewString(tableName, "role")
_systemAuthAdmin.Salt = field.NewString(tableName, "salt")
_systemAuthAdmin.Sort = field.NewInt32(tableName, "sort")
_systemAuthAdmin.IsMultipoint = field.NewInt32(tableName, "is_multipoint")
_systemAuthAdmin.IsDisable = field.NewInt32(tableName, "is_disable")
_systemAuthAdmin.IsDelete = field.NewInt32(tableName, "is_delete")
_systemAuthAdmin.LastLoginIP = field.NewString(tableName, "last_login_ip")
_systemAuthAdmin.LastLoginTime = field.NewInt32(tableName, "last_login_time")
_systemAuthAdmin.CreateTime = field.NewInt32(tableName, "create_time")
_systemAuthAdmin.UpdateTime = field.NewInt32(tableName, "update_time")
_systemAuthAdmin.DeleteTime = field.NewInt32(tableName, "delete_time")
_systemAuthAdmin.fillFieldMap()
return _systemAuthAdmin
}
type systemAuthAdmin struct {
systemAuthAdminDo
ALL field.Asterisk
ID field.Int32 // 主键
DeptID field.Int32 // 部门ID
PostID field.Int32 // 岗位ID
Username field.String // 用户账号
Nickname field.String // 用户昵称
Password field.String // 用户密码
Avatar field.String // 用户头像
Role field.String // 角色主键
Salt field.String // 加密盐巴
Sort field.Int32 // 排序编号
IsMultipoint field.Int32 // 多端登录: 0=否, 1=是
IsDisable field.Int32 // 是否禁用: 0=否, 1=是
IsDelete field.Int32 // 是否删除: 0=否, 1=是
LastLoginIP field.String // 最后登录IP
LastLoginTime field.Int32 // 最后登录
CreateTime field.Int32 // 创建时间
UpdateTime field.Int32 // 更新时间
DeleteTime field.Int32 // 删除时间
fieldMap map[string]field.Expr
}
func (s systemAuthAdmin) Table(newTableName string) *systemAuthAdmin {
s.systemAuthAdminDo.UseTable(newTableName)
return s.updateTableName(newTableName)
}
func (s systemAuthAdmin) As(alias string) *systemAuthAdmin {
s.systemAuthAdminDo.DO = *(s.systemAuthAdminDo.As(alias).(*gen.DO))
return s.updateTableName(alias)
}
func (s *systemAuthAdmin) updateTableName(table string) *systemAuthAdmin {
s.ALL = field.NewAsterisk(table)
s.ID = field.NewInt32(table, "id")
s.DeptID = field.NewInt32(table, "dept_id")
s.PostID = field.NewInt32(table, "post_id")
s.Username = field.NewString(table, "username")
s.Nickname = field.NewString(table, "nickname")
s.Password = field.NewString(table, "password")
s.Avatar = field.NewString(table, "avatar")
s.Role = field.NewString(table, "role")
s.Salt = field.NewString(table, "salt")
s.Sort = field.NewInt32(table, "sort")
s.IsMultipoint = field.NewInt32(table, "is_multipoint")
s.IsDisable = field.NewInt32(table, "is_disable")
s.IsDelete = field.NewInt32(table, "is_delete")
s.LastLoginIP = field.NewString(table, "last_login_ip")
s.LastLoginTime = field.NewInt32(table, "last_login_time")
s.CreateTime = field.NewInt32(table, "create_time")
s.UpdateTime = field.NewInt32(table, "update_time")
s.DeleteTime = field.NewInt32(table, "delete_time")
s.fillFieldMap()
return s
}
func (s *systemAuthAdmin) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := s.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (s *systemAuthAdmin) fillFieldMap() {
s.fieldMap = make(map[string]field.Expr, 18)
s.fieldMap["id"] = s.ID
s.fieldMap["dept_id"] = s.DeptID
s.fieldMap["post_id"] = s.PostID
s.fieldMap["username"] = s.Username
s.fieldMap["nickname"] = s.Nickname
s.fieldMap["password"] = s.Password
s.fieldMap["avatar"] = s.Avatar
s.fieldMap["role"] = s.Role
s.fieldMap["salt"] = s.Salt
s.fieldMap["sort"] = s.Sort
s.fieldMap["is_multipoint"] = s.IsMultipoint
s.fieldMap["is_disable"] = s.IsDisable
s.fieldMap["is_delete"] = s.IsDelete
s.fieldMap["last_login_ip"] = s.LastLoginIP
s.fieldMap["last_login_time"] = s.LastLoginTime
s.fieldMap["create_time"] = s.CreateTime
s.fieldMap["update_time"] = s.UpdateTime
s.fieldMap["delete_time"] = s.DeleteTime
}
func (s systemAuthAdmin) clone(db *gorm.DB) systemAuthAdmin {
s.systemAuthAdminDo.ReplaceConnPool(db.Statement.ConnPool)
return s
}
func (s systemAuthAdmin) replaceDB(db *gorm.DB) systemAuthAdmin {
s.systemAuthAdminDo.ReplaceDB(db)
return s
}
type systemAuthAdminDo struct{ gen.DO }
type ISystemAuthAdminDo interface {
gen.SubQuery
Debug() ISystemAuthAdminDo
WithContext(ctx context.Context) ISystemAuthAdminDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
ReplaceDB(db *gorm.DB)
ReadDB() ISystemAuthAdminDo
WriteDB() ISystemAuthAdminDo
As(alias string) gen.Dao
Session(config *gorm.Session) ISystemAuthAdminDo
Columns(cols ...field.Expr) gen.Columns
Clauses(conds ...clause.Expression) ISystemAuthAdminDo
Not(conds ...gen.Condition) ISystemAuthAdminDo
Or(conds ...gen.Condition) ISystemAuthAdminDo
Select(conds ...field.Expr) ISystemAuthAdminDo
Where(conds ...gen.Condition) ISystemAuthAdminDo
Order(conds ...field.Expr) ISystemAuthAdminDo
Distinct(cols ...field.Expr) ISystemAuthAdminDo
Omit(cols ...field.Expr) ISystemAuthAdminDo
Join(table schema.Tabler, on ...field.Expr) ISystemAuthAdminDo
LeftJoin(table schema.Tabler, on ...field.Expr) ISystemAuthAdminDo
RightJoin(table schema.Tabler, on ...field.Expr) ISystemAuthAdminDo
Group(cols ...field.Expr) ISystemAuthAdminDo
Having(conds ...gen.Condition) ISystemAuthAdminDo
Limit(limit int) ISystemAuthAdminDo
Offset(offset int) ISystemAuthAdminDo
Count() (count int64, err error)
Scopes(funcs ...func(gen.Dao) gen.Dao) ISystemAuthAdminDo
Unscoped() ISystemAuthAdminDo
Create(values ...*model.SystemAuthAdmin) error
CreateInBatches(values []*model.SystemAuthAdmin, batchSize int) error
Save(values ...*model.SystemAuthAdmin) error
First() (*model.SystemAuthAdmin, error)
Take() (*model.SystemAuthAdmin, error)
Last() (*model.SystemAuthAdmin, error)
Find() ([]*model.SystemAuthAdmin, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SystemAuthAdmin, err error)
FindInBatches(result *[]*model.SystemAuthAdmin, batchSize int, fc func(tx gen.Dao, batch int) error) error
Pluck(column field.Expr, dest interface{}) error
Delete(...*model.SystemAuthAdmin) (info gen.ResultInfo, err error)
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao
Attrs(attrs ...field.AssignExpr) ISystemAuthAdminDo
Assign(attrs ...field.AssignExpr) ISystemAuthAdminDo
Joins(fields ...field.RelationField) ISystemAuthAdminDo
Preload(fields ...field.RelationField) ISystemAuthAdminDo
FirstOrInit() (*model.SystemAuthAdmin, error)
FirstOrCreate() (*model.SystemAuthAdmin, error)
FindByPage(offset int, limit int) (result []*model.SystemAuthAdmin, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)
Returning(value interface{}, columns ...string) ISystemAuthAdminDo
UnderlyingDB() *gorm.DB
schema.Tabler
}
func (s systemAuthAdminDo) Debug() ISystemAuthAdminDo {
return s.withDO(s.DO.Debug())
}
func (s systemAuthAdminDo) WithContext(ctx context.Context) ISystemAuthAdminDo {
return s.withDO(s.DO.WithContext(ctx))
}
func (s systemAuthAdminDo) ReadDB() ISystemAuthAdminDo {
return s.Clauses(dbresolver.Read)
}
func (s systemAuthAdminDo) WriteDB() ISystemAuthAdminDo {
return s.Clauses(dbresolver.Write)
}
func (s systemAuthAdminDo) Session(config *gorm.Session) ISystemAuthAdminDo {
return s.withDO(s.DO.Session(config))
}
func (s systemAuthAdminDo) Clauses(conds ...clause.Expression) ISystemAuthAdminDo {
return s.withDO(s.DO.Clauses(conds...))
}
func (s systemAuthAdminDo) Returning(value interface{}, columns ...string) ISystemAuthAdminDo {
return s.withDO(s.DO.Returning(value, columns...))
}
func (s systemAuthAdminDo) Not(conds ...gen.Condition) ISystemAuthAdminDo {
return s.withDO(s.DO.Not(conds...))
}
func (s systemAuthAdminDo) Or(conds ...gen.Condition) ISystemAuthAdminDo {
return s.withDO(s.DO.Or(conds...))
}
func (s systemAuthAdminDo) Select(conds ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.Select(conds...))
}
func (s systemAuthAdminDo) Where(conds ...gen.Condition) ISystemAuthAdminDo {
return s.withDO(s.DO.Where(conds...))
}
func (s systemAuthAdminDo) Order(conds ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.Order(conds...))
}
func (s systemAuthAdminDo) Distinct(cols ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.Distinct(cols...))
}
func (s systemAuthAdminDo) Omit(cols ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.Omit(cols...))
}
func (s systemAuthAdminDo) Join(table schema.Tabler, on ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.Join(table, on...))
}
func (s systemAuthAdminDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.LeftJoin(table, on...))
}
func (s systemAuthAdminDo) RightJoin(table schema.Tabler, on ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.RightJoin(table, on...))
}
func (s systemAuthAdminDo) Group(cols ...field.Expr) ISystemAuthAdminDo {
return s.withDO(s.DO.Group(cols...))
}
func (s systemAuthAdminDo) Having(conds ...gen.Condition) ISystemAuthAdminDo {
return s.withDO(s.DO.Having(conds...))
}
func (s systemAuthAdminDo) Limit(limit int) ISystemAuthAdminDo {
return s.withDO(s.DO.Limit(limit))
}
func (s systemAuthAdminDo) Offset(offset int) ISystemAuthAdminDo {
return s.withDO(s.DO.Offset(offset))
}
func (s systemAuthAdminDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISystemAuthAdminDo {
return s.withDO(s.DO.Scopes(funcs...))
}
func (s systemAuthAdminDo) Unscoped() ISystemAuthAdminDo {
return s.withDO(s.DO.Unscoped())
}
func (s systemAuthAdminDo) Create(values ...*model.SystemAuthAdmin) error {
if len(values) == 0 {
return nil
}
return s.DO.Create(values)
}
func (s systemAuthAdminDo) CreateInBatches(values []*model.SystemAuthAdmin, batchSize int) error {
return s.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (s systemAuthAdminDo) Save(values ...*model.SystemAuthAdmin) error {
if len(values) == 0 {
return nil
}
return s.DO.Save(values)
}
func (s systemAuthAdminDo) First() (*model.SystemAuthAdmin, error) {
if result, err := s.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.SystemAuthAdmin), nil
}
}
func (s systemAuthAdminDo) Take() (*model.SystemAuthAdmin, error) {
if result, err := s.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.SystemAuthAdmin), nil
}
}
func (s systemAuthAdminDo) Last() (*model.SystemAuthAdmin, error) {
if result, err := s.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.SystemAuthAdmin), nil
}
}
func (s systemAuthAdminDo) Find() ([]*model.SystemAuthAdmin, error) {
result, err := s.DO.Find()
return result.([]*model.SystemAuthAdmin), err
}
func (s systemAuthAdminDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SystemAuthAdmin, err error) {
buf := make([]*model.SystemAuthAdmin, 0, batchSize)
err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (s systemAuthAdminDo) FindInBatches(result *[]*model.SystemAuthAdmin, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return s.DO.FindInBatches(result, batchSize, fc)
}
func (s systemAuthAdminDo) Attrs(attrs ...field.AssignExpr) ISystemAuthAdminDo {
return s.withDO(s.DO.Attrs(attrs...))
}
func (s systemAuthAdminDo) Assign(attrs ...field.AssignExpr) ISystemAuthAdminDo {
return s.withDO(s.DO.Assign(attrs...))
}
func (s systemAuthAdminDo) Joins(fields ...field.RelationField) ISystemAuthAdminDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Joins(_f))
}
return &s
}
func (s systemAuthAdminDo) Preload(fields ...field.RelationField) ISystemAuthAdminDo {
for _, _f := range fields {
s = *s.withDO(s.DO.Preload(_f))
}
return &s
}
func (s systemAuthAdminDo) FirstOrInit() (*model.SystemAuthAdmin, error) {
if result, err := s.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.SystemAuthAdmin), nil
}
}
func (s systemAuthAdminDo) FirstOrCreate() (*model.SystemAuthAdmin, error) {
if result, err := s.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.SystemAuthAdmin), nil
}
}
func (s systemAuthAdminDo) FindByPage(offset int, limit int) (result []*model.SystemAuthAdmin, count int64, err error) {
result, err = s.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = s.Offset(-1).Limit(-1).Count()
return
}
func (s systemAuthAdminDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = s.Count()
if err != nil {
return
}
err = s.Offset(offset).Limit(limit).Scan(result)
return
}
func (s systemAuthAdminDo) Scan(result interface{}) (err error) {
return s.DO.Scan(result)
}
func (s systemAuthAdminDo) Delete(models ...*model.SystemAuthAdmin) (result gen.ResultInfo, err error) {
return s.DO.Delete(models)
}
func (s *systemAuthAdminDo) withDO(do gen.Dao) *systemAuthAdminDo {
s.DO = *do.(*gen.DO)
return s
}

View File

@@ -28,7 +28,7 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user {
tableName := _user.userDo.TableName()
_user.ALL = field.NewAsterisk(tableName)
_user.ID = field.NewInt32(tableName, "id")
_user.Sn = field.NewInt32(tableName, "sn")
_user.Sn = field.NewInt64(tableName, "sn")
_user.Avatar = field.NewString(tableName, "avatar")
_user.RealName = field.NewString(tableName, "real_name")
_user.Nickname = field.NewString(tableName, "nickname")
@@ -40,7 +40,7 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user {
_user.IsDisable = field.NewInt32(tableName, "is_disable")
_user.LoginIP = field.NewString(tableName, "login_ip")
_user.LoginTime = field.NewInt32(tableName, "login_time")
_user.IsNewUser = field.NewBool(tableName, "is_new_user")
_user.IsNewUser = field.NewInt32(tableName, "is_new_user")
_user.UserMoney = field.NewFloat64(tableName, "user_money")
_user.TotalRechargeAmount = field.NewFloat64(tableName, "total_recharge_amount")
_user.CreateTime = field.NewInt32(tableName, "create_time")
@@ -57,7 +57,7 @@ type user struct {
ALL field.Asterisk
ID field.Int32 // 主键
Sn field.Int32 // 编号
Sn field.Int64 // 编号
Avatar field.String // 头像
RealName field.String // 真实姓名
Nickname field.String // 用户昵称
@@ -69,7 +69,7 @@ type user struct {
IsDisable field.Int32 // 是否禁用: [0=否, 1=是]
LoginIP field.String // 最后登录IP
LoginTime field.Int32 // 最后登录时间
IsNewUser field.Bool // 是否是新注册用户: [1-是, 0-否]
IsNewUser field.Int32 // 是否是新注册用户: [1-是, 0-否]
UserMoney field.Float64 // 用户余额
TotalRechargeAmount field.Float64 // 累计充值
CreateTime field.Int32 // 创建时间
@@ -92,7 +92,7 @@ func (u user) As(alias string) *user {
func (u *user) updateTableName(table string) *user {
u.ALL = field.NewAsterisk(table)
u.ID = field.NewInt32(table, "id")
u.Sn = field.NewInt32(table, "sn")
u.Sn = field.NewInt64(table, "sn")
u.Avatar = field.NewString(table, "avatar")
u.RealName = field.NewString(table, "real_name")
u.Nickname = field.NewString(table, "nickname")
@@ -104,7 +104,7 @@ func (u *user) updateTableName(table string) *user {
u.IsDisable = field.NewInt32(table, "is_disable")
u.LoginIP = field.NewString(table, "login_ip")
u.LoginTime = field.NewInt32(table, "login_time")
u.IsNewUser = field.NewBool(table, "is_new_user")
u.IsNewUser = field.NewInt32(table, "is_new_user")
u.UserMoney = field.NewFloat64(table, "user_money")
u.TotalRechargeAmount = field.NewFloat64(table, "total_recharge_amount")
u.CreateTime = field.NewInt32(table, "create_time")

View File

@@ -28,7 +28,7 @@ func newUserAccountLog(db *gorm.DB, opts ...gen.DOOption) userAccountLog {
tableName := _userAccountLog.userAccountLogDo.TableName()
_userAccountLog.ALL = field.NewAsterisk(tableName)
_userAccountLog.ID = field.NewInt32(tableName, "id")
_userAccountLog.Sn = field.NewString(tableName, "sn")
_userAccountLog.Sn = field.NewInt64(tableName, "sn")
_userAccountLog.UserID = field.NewInt32(tableName, "user_id")
_userAccountLog.ChangeObject = field.NewInt32(tableName, "change_object")
_userAccountLog.ChangeType = field.NewInt32(tableName, "change_type")
@@ -41,6 +41,11 @@ func newUserAccountLog(db *gorm.DB, opts ...gen.DOOption) userAccountLog {
_userAccountLog.CreateTime = field.NewInt32(tableName, "create_time")
_userAccountLog.UpdateTime = field.NewInt32(tableName, "update_time")
_userAccountLog.DeleteTime = field.NewInt32(tableName, "delete_time")
_userAccountLog.User = userAccountLogBelongsToUser{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("User", "model.User"),
}
_userAccountLog.fillFieldMap()
@@ -52,7 +57,7 @@ type userAccountLog struct {
ALL field.Asterisk
ID field.Int32
Sn field.String // 流水
Sn field.Int64 // 用户编
UserID field.Int32 // 用户id
ChangeObject field.Int32 // 变动对象
ChangeType field.Int32 // 变动类型
@@ -65,6 +70,7 @@ type userAccountLog struct {
CreateTime field.Int32 // 创建时间
UpdateTime field.Int32 // 更新时间
DeleteTime field.Int32 // 删除时间
User userAccountLogBelongsToUser
fieldMap map[string]field.Expr
}
@@ -82,7 +88,7 @@ func (u userAccountLog) As(alias string) *userAccountLog {
func (u *userAccountLog) updateTableName(table string) *userAccountLog {
u.ALL = field.NewAsterisk(table)
u.ID = field.NewInt32(table, "id")
u.Sn = field.NewString(table, "sn")
u.Sn = field.NewInt64(table, "sn")
u.UserID = field.NewInt32(table, "user_id")
u.ChangeObject = field.NewInt32(table, "change_object")
u.ChangeType = field.NewInt32(table, "change_type")
@@ -111,7 +117,7 @@ func (u *userAccountLog) GetFieldByName(fieldName string) (field.OrderExpr, bool
}
func (u *userAccountLog) fillFieldMap() {
u.fieldMap = make(map[string]field.Expr, 14)
u.fieldMap = make(map[string]field.Expr, 15)
u.fieldMap["id"] = u.ID
u.fieldMap["sn"] = u.Sn
u.fieldMap["user_id"] = u.UserID
@@ -126,6 +132,7 @@ func (u *userAccountLog) fillFieldMap() {
u.fieldMap["create_time"] = u.CreateTime
u.fieldMap["update_time"] = u.UpdateTime
u.fieldMap["delete_time"] = u.DeleteTime
}
func (u userAccountLog) clone(db *gorm.DB) userAccountLog {
@@ -138,6 +145,77 @@ func (u userAccountLog) replaceDB(db *gorm.DB) userAccountLog {
return u
}
type userAccountLogBelongsToUser struct {
db *gorm.DB
field.RelationField
}
func (a userAccountLogBelongsToUser) Where(conds ...field.Expr) *userAccountLogBelongsToUser {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a userAccountLogBelongsToUser) WithContext(ctx context.Context) *userAccountLogBelongsToUser {
a.db = a.db.WithContext(ctx)
return &a
}
func (a userAccountLogBelongsToUser) Session(session *gorm.Session) *userAccountLogBelongsToUser {
a.db = a.db.Session(session)
return &a
}
func (a userAccountLogBelongsToUser) Model(m *model.UserAccountLog) *userAccountLogBelongsToUserTx {
return &userAccountLogBelongsToUserTx{a.db.Model(m).Association(a.Name())}
}
type userAccountLogBelongsToUserTx struct{ tx *gorm.Association }
func (a userAccountLogBelongsToUserTx) Find() (result *model.User, err error) {
return result, a.tx.Find(&result)
}
func (a userAccountLogBelongsToUserTx) Append(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a userAccountLogBelongsToUserTx) Replace(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a userAccountLogBelongsToUserTx) Delete(values ...*model.User) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a userAccountLogBelongsToUserTx) Clear() error {
return a.tx.Clear()
}
func (a userAccountLogBelongsToUserTx) Count() int64 {
return a.tx.Count()
}
type userAccountLogDo struct{ gen.DO }
type IUserAccountLogDo interface {

View File

@@ -1,6 +1,6 @@
package generator
//GenConstants 代码生成常量
// GenConstants 代码生成常量
var GenConstants = genConstants{
UTF8: "utf-8", //编码
TplCrud: "crud", //单表 (增删改查)
@@ -10,15 +10,15 @@ var GenConstants = genConstants{
Require: 1, //需要的
}
//GoConstants Go相关常量
// GoConstants Go相关常量
var GoConstants = goConstants{
TypeString: "string", //字符串类型
TypeFloat: "float64", //浮点型
TypeInt: "int", //整型
TypeInt: "int32", //整型
TypeDate: "core.TsTime", //时间类型
}
//SqlConstants 数据库相关常量
// SqlConstants 数据库相关常量
var SqlConstants = sqlConstants{
//数据库字符串类型
ColumnTypeStr: []string{"char", "varchar", "nvarchar", "varchar2"},
@@ -27,7 +27,7 @@ var SqlConstants = sqlConstants{
//数据库时间类型
ColumnTypeTime: []string{"datetime", "time", "date", "timestamp"},
//数据库数字类型
ColumnTypeNumber: []string{"tinyint", "smallint", "mediumint", "int", "integer", "bit", "bigint",
ColumnTypeNumber: []string{"tinyint", "smallint", "mediumint", "int", "int unsigned", "integer", "bit", "bigint",
"float", "double", "decimal"},
//时间日期字段名
ColumnTimeName: []string{"create_time", "update_time", "delete_time", "start_time", "end_time"},
@@ -41,7 +41,7 @@ var SqlConstants = sqlConstants{
ColumnNameNotQuery: []string{"is_delete", "create_time", "update_time", "delete_time"},
}
//HtmlConstants HTML相关常量
// HtmlConstants HTML相关常量
var HtmlConstants = htmlConstants{
HtmlInput: "input", //文本框
HtmlTextarea: "textarea", //文本域

View File

@@ -34,50 +34,50 @@ type {{{ toCamelCase .ModuleName }}}Handler struct {
//list {{{ .ModuleName }}}列表
func (hd {{{ toCamelCase .ModuleName }}}Handler) list(c *gin.Context) {
var page request.PageReq
var listReq {{{ title (toCamelCase .EntityName) }}}ListReq
var listReq req.{{{ title (toCamelCase .EntityName) }}}ListReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
return
}
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
return
}
res, err := ph.srv.List(page, listReq)
res, err := hd.srv.List(c,page, listReq)
response.CheckAndRespWithData(c, res, err)
}
//detail {{{ .ModuleName }}}详情
func (hd {{{ toCamelCase .ModuleName }}}Handler) detail(c *gin.Context) {
var detailReq {{{ title (toCamelCase .EntityName) }}}DetailReq
var detailReq req.{{{ title (toCamelCase .EntityName) }}}DetailReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &detailReq)) {
return
}
res, err := hd.srv.Detail(detailReq.{{{ title (toCamelCase .PrimaryKey) }}})
res, err := hd.srv.Detail(c,detailReq.{{{ title (toCamelCase .PrimaryKey) }}})
response.CheckAndRespWithData(c, res, err)
}
//add {{{ .ModuleName }}}新增
func (hd {{{ toCamelCase .ModuleName }}}Handler) add(c *gin.Context) {
var addReq {{{ title (toCamelCase .EntityName) }}}AddReq
var addReq req.{{{ title (toCamelCase .EntityName) }}}AddReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &addReq)) {
return
}
response.CheckAndResp(c, hd.srv.Add(addReq))
response.CheckAndResp(c, hd.srv.Add(c,addReq))
}
//edit {{{ .ModuleName }}}编辑
func (hd {{{ toCamelCase .ModuleName }}}Handler) edit(c *gin.Context) {
var editReq {{{ title (toCamelCase .EntityName) }}}EditReq
var editReq req.{{{ title (toCamelCase .EntityName) }}}EditReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &editReq)) {
return
}
response.CheckAndResp(c, hd.srv.Edit(editReq))
response.CheckAndResp(c, hd.srv.Edit(c,editReq))
}
//del {{{ .ModuleName }}}删除
func (hd {{{ toCamelCase .ModuleName }}}Handler) del(c *gin.Context) {
var delReq {{{ title (toCamelCase .EntityName) }}}DelReq
var delReq req.{{{ title (toCamelCase .EntityName) }}}DelReq
if response.IsFailWithResp(c, util.VerifyUtil.VerifyBody(c, &delReq)) {
return
}
response.CheckAndResp(c, hd.srv.Del(delReq.{{{ title (toCamelCase .PrimaryKey) }}}))
response.CheckAndResp(c, hd.srv.Del(c,delReq.{{{ title (toCamelCase .PrimaryKey) }}}))
}

View File

@@ -8,7 +8,7 @@ import (
type {{{ title (toCamelCase .EntityName) }}}ListReq struct {
{{{- range .Columns }}}
{{{- if .IsQuery }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ toCamelCase .JavaField }}}"` // {{{ .ColumnComment }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ .JavaField }}}"` // {{{ .ColumnComment }}}
{{{- end }}}
{{{- end }}}
}
@@ -17,7 +17,7 @@ type {{{ title (toCamelCase .EntityName) }}}ListReq struct {
type {{{ title (toCamelCase .EntityName) }}}DetailReq struct {
{{{- range .Columns }}}
{{{- if .IsPk }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ toCamelCase .JavaField }}}"` // {{{ .ColumnComment }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ .JavaField }}}"` // {{{ .ColumnComment }}}
{{{- end }}}
{{{- end }}}
}
@@ -26,7 +26,7 @@ type {{{ title (toCamelCase .EntityName) }}}DetailReq struct {
type {{{ title (toCamelCase .EntityName) }}}AddReq struct {
{{{- range .Columns }}}
{{{- if .IsInsert }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ toCamelCase .JavaField }}}"` // {{{ .ColumnComment }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ .JavaField }}}"` // {{{ .ColumnComment }}}
{{{- end }}}
{{{- end }}}
}
@@ -35,7 +35,7 @@ type {{{ title (toCamelCase .EntityName) }}}AddReq struct {
type {{{ title (toCamelCase .EntityName) }}}EditReq struct {
{{{- range .Columns }}}
{{{- if .IsEdit }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ toCamelCase .JavaField }}}"` // {{{ .ColumnComment }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ .JavaField }}}"` // {{{ .ColumnComment }}}
{{{- end }}}
{{{- end }}}
}
@@ -44,7 +44,7 @@ type {{{ title (toCamelCase .EntityName) }}}EditReq struct {
type {{{ title (toCamelCase .EntityName) }}}DelReq struct {
{{{- range .Columns }}}
{{{- if .IsPk }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ toCamelCase .JavaField }}}"` // {{{ .ColumnComment }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `form:"{{{ .JavaField }}}"` // {{{ .ColumnComment }}}
{{{- end }}}
{{{- end }}}
}
@@ -53,7 +53,7 @@ type {{{ title (toCamelCase .EntityName) }}}DelReq struct {
type {{{ title (toCamelCase .EntityName) }}}Resp struct {
{{{- range .Columns }}}
{{{- if or .IsList .IsPk }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `json:"{{{ toCamelCase .JavaField }}}" structs:"{{{ toCamelCase .JavaField }}}"` // {{{ .ColumnComment }}}
{{{ title (toCamelCase .JavaField) }}} {{{ .JavaType }}} `json:"{{{ .JavaField }}}" structs:"{{{ .JavaField }}}"` // {{{ .ColumnComment }}}
{{{- end }}}
{{{- end }}}
}

View File

@@ -8,11 +8,11 @@ import (
)
type I{{{ title (toCamelCase .EntityName) }}}Service interface {
List(page request.PageReq, listReq {{{ title (toCamelCase .EntityName) }}}ListReq) (res response.PageResp, e error)
Detail(id uint) (res {{{ title (toCamelCase .EntityName) }}}Resp, e error)
Add(addReq {{{ title (toCamelCase .EntityName) }}}AddReq) (e error)
Edit(editReq {{{ title (toCamelCase .EntityName) }}}EditReq) (e error)
Del(id uint) (e error)
List(c *gin.Context, page request.PageReq, listReq req.{{{ title (toCamelCase .EntityName) }}}ListReq) (res response.PageResp, e error)
Detail(c *gin.Context, id uint) (res {{{ title (toCamelCase .EntityName) }}}Resp, e error)
Add(c *gin.Context, addReq req.{{{ title (toCamelCase .EntityName) }}}AddReq) (e error)
Edit(c *gin.Context, editReq req.{{{ title (toCamelCase .EntityName) }}}EditReq) (e error)
Del(c *gin.Context, id uint) (e error)
}
//New{{{ title (toCamelCase .EntityName) }}}Service 初始化
@@ -27,42 +27,44 @@ type {{{ toCamelCase .EntityName }}}Service struct {
}
//List {{{ .FunctionName }}}列表
func (srv {{{ toCamelCase .EntityName }}}Service) List(page request.PageReq, listReq {{{ title (toCamelCase .EntityName) }}}ListReq) (res response.PageResp, e error) {
func (srv {{{ toCamelCase .EntityName }}}Service) List(c *gin.Context, page request.PageReq, listReq req.{{{ title (toCamelCase .EntityName) }}}ListReq) (res response.PageResp, e error) {
//
limit := page.PageSize
offset := page.PageSize * (page.PageNo - 1)
m := srv.dao.{{{ title (toCamelCase .EntityName) }}}
q := m.WithContext(c)
//
model := srv.db.Model(&{{{ title (toCamelCase .EntityName) }}}{})
{{{- range .Columns }}}
{{{- if .IsQuery }}}
{{{- $queryOpr := index $.ModelOprMap .QueryType }}}
{{{- if and (eq .JavaType "string") (eq $queryOpr "like") }}}
if listReq.{{{ title (toCamelCase .ColumnName) }}} != "" {
model = model.Where("{{{ .ColumnName }}} like ?", "%"+listReq.{{{ title (toCamelCase .ColumnName) }}}+"%")
q = q.Where(m.{{{(toCamelCase .ColumnName) }}}.Like("%"+listReq.{{{ title (toCamelCase .ColumnName) }}}+"%"))
}
{{{- else }}}
if listReq.{{{ title (toCamelCase .ColumnName) }}} {{{ if eq .JavaType "string" }}}!= ""{{{ else }}}>=0{{{ end }}} {
model = model.Where("{{{ .ColumnName }}} = ?", listReq.{{{ title (toCamelCase .ColumnName) }}})
q = q.Where(m.{{{ title (toCamelCase .ColumnName) }}}.Eq(listReq.{{{ title (toCamelCase .ColumnName) }}}))
}
{{{- end }}}
{{{- end }}}
{{{- end }}}
{{{- if contains .AllFields "is_delete" }}}
model = model.Where("is_delete = ?", 0)
q = q.Where(m.IsDelete.Eq(0))
{{{- end }}}
//
var count int64
err := model.Count(&count).Error
count, err := q.Count()
if e = response.CheckErr(err, "List Count err"); e != nil {
return
}
//
var objs []{{{ title (toCamelCase .EntityName) }}}
err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
objs, err := q.Limit(limit).Offset(offset).Order(m.ID.Desc()).Find()
if e = response.CheckErr(err, "List Find err"); e != nil {
return
}
resps := []{{{ title (toCamelCase .EntityName) }}}Resp{}
var resps []resp.{{{ title (toCamelCase .EntityName) }}}Resp
response.Copy(&resps, objs)
return response.PageResp{
PageNo: page.PageNo,
@@ -73,9 +75,11 @@ func (srv {{{ toCamelCase .EntityName }}}Service) List(page request.PageReq, lis
}
//Detail {{{ .FunctionName }}}详情
func (srv {{{ toCamelCase .EntityName }}}Service) Detail(id uint) (res {{{ title (toCamelCase .EntityName) }}}Resp, e error) {
var obj {{{ title (toCamelCase .EntityName) }}}
err := srv.db.Where("{{{ $.PrimaryKey }}} = ?{{{ if contains .AllFields "is_delete" }}} AND is_delete = ?{{{ end }}}", id{{{ if contains .AllFields "is_delete" }}}, 0{{{ end }}}).Limit(1).First(&obj).Error
func (srv {{{ toCamelCase .EntityName }}}Service) Detail(c *gin.Context, id uint) (res {{{ title (toCamelCase .EntityName) }}}Resp, e error) {
m := srv.dao.{{{ title (toCamelCase .EntityName) }}}
q := m.WithContext(c)
obj, err := q.Where(m.{{{ title (toCamelCase $.PrimaryKey) }}}.Eq(id) {{{ if contains .AllFields "is_delete" }}} , m.IsDelete.Eq(0) {{{ end }}}).First()
if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil {
return
}
@@ -92,18 +96,24 @@ func (srv {{{ toCamelCase .EntityName }}}Service) Detail(id uint) (res {{{ title
}
//Add {{{ .FunctionName }}}新增
func (srv {{{ toCamelCase .EntityName }}}Service) Add(addReq {{{ title (toCamelCase .EntityName) }}}AddReq) (e error) {
func (srv {{{ toCamelCase .EntityName }}}Service) Add(c *gin.Context, addReq req.{{{ title (toCamelCase .EntityName) }}}AddReq) (e error) {
m := srv.dao.{{{ title (toCamelCase .EntityName) }}}
q := m.WithContext(c)
var obj {{{ title (toCamelCase .EntityName) }}}
response.Copy(&obj, addReq)
err := srv.db.Create(&obj).Error
err := q.Create(&obj)
e = response.CheckErr(err, "Add Create err")
return
}
//Edit {{{ .FunctionName }}}编辑
func (srv {{{ toCamelCase .EntityName }}}Service) Edit(editReq {{{ title (toCamelCase .EntityName) }}}EditReq) (e error) {
func (srv {{{ toCamelCase .EntityName }}}Service) Edit(c *gin.Context, editReq req.{{{ title (toCamelCase .EntityName) }}}EditReq) (e error) {
m := srv.dao.{{{ title (toCamelCase .EntityName) }}}
q := m.WithContext(c)
var obj {{{ title (toCamelCase .EntityName) }}}
err := srv.db.Where("{{{ $.PrimaryKey }}} = ?{{{ if contains .AllFields "is_delete" }}} AND is_delete = ?{{{ end }}}", editReq.ID{{{ if contains .AllFields "is_delete" }}}, 0{{{ end }}}).Limit(1).First(&obj).Error
obj, err := q.Where(m.{{{ title (toCamelCase $.PrimaryKey) }}}.Eq(id) {{{ if contains .AllFields "is_delete" }}} , m.IsDelete.Eq(0) {{{ end }}}).First()
//
if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil {
return
@@ -113,15 +123,17 @@ func (srv {{{ toCamelCase .EntityName }}}Service) Edit(editReq {{{ title (toCame
}
//
response.Copy(&obj, editReq)
err = srv.db.Model(&obj).Updates(obj).Error
err = q.Updates(obj)
e = response.CheckErr(err, "Edit Updates err")
return
}
//Del {{{ .FunctionName }}}删除
func (srv {{{ toCamelCase .EntityName }}}Service) Del(id uint) (e error) {
var obj {{{ title (toCamelCase .EntityName) }}}
err := srv.db.Where("{{{ $.PrimaryKey }}} = ?{{{ if contains .AllFields "is_delete" }}} AND is_delete = ?{{{ end }}}", id{{{ if contains .AllFields "is_delete" }}}, 0{{{ end }}}).Limit(1).First(&obj).Error
func (srv {{{ toCamelCase .EntityName }}}Service) Del(c *gin.Context, id uint) (e error) {
m := srv.dao.{{{ title (toCamelCase .EntityName) }}}
q := m.WithContext(c)
_, err := q.Where(m.{{{ title (toCamelCase $.PrimaryKey) }}}.Eq(id) {{{ if contains .AllFields "is_delete" }}} , m.IsDelete.Eq(0) {{{ end }}}).First()
//
if e = response.CheckErrDBNotRecord(err, "数据不存在!"); e != nil {
return
@@ -131,11 +143,10 @@ func (srv {{{ toCamelCase .EntityName }}}Service) Del(id uint) (e error) {
}
//
{{{- if contains .AllFields "is_delete" }}}
obj.IsDelete = 1
err = srv.db.Save(&obj).Error
err = q.Where(m.{{{ title (toCamelCase $.PrimaryKey) }}}.Eq(id)).Update(m.IsDelete, 1)
e = response.CheckErr(err, "Del Save err")
{{{- else }}}
err = srv.db.Delete(&obj).Error
err = q.Where(m.{{{ title (toCamelCase $.PrimaryKey) }}}.Eq(id)).Delete()
e = response.CheckErr(err, "Del Delete err")
{{{- end }}}
return

View File

@@ -0,0 +1,28 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package model
const TableNameNoticeSetting = "la_notice_setting"
// NoticeSetting mapped from table <la_notice_setting>
type NoticeSetting struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
SceneID int32 `gorm:"column:scene_id;not null;comment:场景id" json:"scene_id"` // 场景id
SceneName string `gorm:"column:scene_name;not null;comment:场景名称" json:"scene_name"` // 场景名称
SceneDesc string `gorm:"column:scene_desc;not null;comment:场景描述" json:"scene_desc"` // 场景描述
Recipient int32 `gorm:"column:recipient;not null;default:1;comment:接收者 1-用户 2-平台" json:"recipient"` // 接收者 1-用户 2-平台
Type int32 `gorm:"column:type;not null;default:1;comment:通知类型: 1-业务通知 2-验证码" json:"type"` // 通知类型: 1-业务通知 2-验证码
SystemNotice string `gorm:"column:system_notice;comment:系统通知设置" json:"system_notice"` // 系统通知设置
SmsNotice string `gorm:"column:sms_notice;comment:短信通知设置" json:"sms_notice"` // 短信通知设置
OaNotice string `gorm:"column:oa_notice;comment:公众号通知设置" json:"oa_notice"` // 公众号通知设置
MnpNotice string `gorm:"column:mnp_notice;comment:小程序通知设置" json:"mnp_notice"` // 小程序通知设置
Support string `gorm:"column:support;not null;comment:支持的发送类型 1-系统通知 2-短信通知 3-微信模板消息 4-小程序提醒" json:"support"` // 支持的发送类型 1-系统通知 2-短信通知 3-微信模板消息 4-小程序提醒
UpdateTime int32 `gorm:"column:update_time;comment:更新时间" json:"update_time"` // 更新时间
}
// TableName NoticeSetting's table name
func (*NoticeSetting) TableName() string {
return TableNameNoticeSetting
}

View File

@@ -0,0 +1,33 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package model
const TableNameRechargeOrder = "la_recharge_order"
// RechargeOrder mapped from table <la_recharge_order>
type RechargeOrder struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:id" json:"id"` // id
Sn string `gorm:"column:sn;not null;comment:订单编号" json:"sn"` // 订单编号
UserID int32 `gorm:"column:user_id;not null;comment:用户id" json:"user_id"` // 用户id
UserSn int32 `gorm:"column:user_sn;not null;comment:用户编号" json:"user_sn"` // 用户编号
Mobile string `gorm:"column:mobile" json:"mobile"`
PaySn string `gorm:"column:pay_sn;comment:支付编号-冗余字段,针对微信同一主体不同客户端支付需用不同订单号预留。" json:"pay_sn"` // 支付编号-冗余字段,针对微信同一主体不同客户端支付需用不同订单号预留。
PayWay int32 `gorm:"column:pay_way;not null;default:2;comment:支付方式 2-微信支付 3-支付宝支付" json:"pay_way"` // 支付方式 2-微信支付 3-支付宝支付
PayStatus int32 `gorm:"column:pay_status;not null;default:2;comment:支付状态2-待支付1-已支付" json:"pay_status"` // 支付状态2-待支付1-已支付
PayTime int32 `gorm:"column:pay_time;comment:支付时间" json:"pay_time"` // 支付时间
OrderAmount float64 `gorm:"column:order_amount;not null;comment:充值金额" json:"order_amount"` // 充值金额
OrderTerminal int32 `gorm:"column:order_terminal;default:1;comment:终端" json:"order_terminal"` // 终端
TransactionID string `gorm:"column:transaction_id;comment:第三方平台交易流水号" json:"transaction_id"` // 第三方平台交易流水号
RefundStatus int32 `gorm:"column:refund_status;comment:退款状态 0-未退款 1-已退款" json:"refund_status"` // 退款状态 0-未退款 1-已退款
CreateTime int32 `gorm:"column:create_time;comment:创建时间" json:"create_time"` // 创建时间
UpdateTime int32 `gorm:"column:update_time;comment:更新时间" json:"update_time"` // 更新时间
DeleteTime int32 `gorm:"column:delete_time;comment:删除时间" json:"delete_time"` // 删除时间
User User `gorm:"foreignKey:UserID;references:ID" json:"user"`
}
// TableName RechargeOrder's table name
func (*RechargeOrder) TableName() string {
return TableNameRechargeOrder
}

View File

@@ -0,0 +1,28 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package model
const TableNameRefundLog = "la_refund_log"
// RefundLog mapped from table <la_refund_log>
type RefundLog struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:id" json:"id"` // id
Sn string `gorm:"column:sn;comment:编号" json:"sn"` // 编号
RecordID int32 `gorm:"column:record_id;not null;comment:退款记录id" json:"record_id"` // 退款记录id
UserID int32 `gorm:"column:user_id;not null;comment:关联用户" json:"user_id"` // 关联用户
HandleID int32 `gorm:"column:handle_id;not null;comment:处理人id管理员id" json:"handle_id"` // 处理人id管理员id
OrderAmount float64 `gorm:"column:order_amount;not null;default:0.00;comment:订单总的应付款金额,冗余字段" json:"order_amount"` // 订单总的应付款金额,冗余字段
RefundAmount float64 `gorm:"column:refund_amount;not null;default:0.00;comment:本次退款金额" json:"refund_amount"` // 本次退款金额
RefundStatus int32 `gorm:"column:refund_status;not null;comment:退款状态0退款中1退款成功2退款失败" json:"refund_status"` // 退款状态0退款中1退款成功2退款失败
RefundMsg string `gorm:"column:refund_msg;comment:退款信息" json:"refund_msg"` // 退款信息
CreateTime int32 `gorm:"column:create_time;comment:创建时间" json:"create_time"` // 创建时间
UpdateTime int32 `gorm:"column:update_time;comment:更新时间" json:"update_time"` // 更新时间
Admin SystemAuthAdmin `gorm:"foreignKey:HandleID;references:ID" json:"admin"`
}
// TableName RefundLog's table name
func (*RefundLog) TableName() string {
return TableNameRefundLog
}

View File

@@ -0,0 +1,32 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package model
const TableNameRefundRecord = "la_refund_record"
// RefundRecord mapped from table <la_refund_record>
type RefundRecord struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:id" json:"id"` // id
Sn string `gorm:"column:sn;not null;comment:退款编号" json:"sn"` // 退款编号
UserID int32 `gorm:"column:user_id;not null;comment:关联用户" json:"user_id"` // 关联用户
UserSn int64 `gorm:"column:user_sn" json:"user_sn"`
OrderID int32 `gorm:"column:order_id;not null;comment:来源订单id" json:"order_id"` // 来源订单id
OrderSn string `gorm:"column:order_sn;not null;comment:来源单号" json:"order_sn"` // 来源单号
OrderType string `gorm:"column:order_type;default:order;comment:订单来源 order-商品订单 recharge-充值订单" json:"order_type"` // 订单来源 order-商品订单 recharge-充值订单
OrderAmount float64 `gorm:"column:order_amount;not null;default:0.00;comment:订单总的应付款金额,冗余字段" json:"order_amount"` // 订单总的应付款金额,冗余字段
RefundAmount float64 `gorm:"column:refund_amount;not null;default:0.00;comment:本次退款金额" json:"refund_amount"` // 本次退款金额
TransactionID string `gorm:"column:transaction_id;comment:第三方平台交易流水号" json:"transaction_id"` // 第三方平台交易流水号
RefundWay int32 `gorm:"column:refund_way;not null;comment:退款方式 1-线上退款 2-线下退款" json:"refund_way"` // 退款方式 1-线上退款 2-线下退款
RefundType int32 `gorm:"column:refund_type;not null;comment:退款类型 1-后台退款" json:"refund_type"` // 退款类型 1-后台退款
RefundStatus int32 `gorm:"column:refund_status;not null;comment:退款状态0退款中1退款成功2退款失败" json:"refund_status"` // 退款状态0退款中1退款成功2退款失败
CreateTime int32 `gorm:"column:create_time;comment:创建时间" json:"create_time"` // 创建时间
UpdateTime int32 `gorm:"column:update_time;comment:更新时间" json:"update_time"` // 更新时间
User User `gorm:"foreignKey:UserID;references:ID" json:"user"`
}
// TableName RefundRecord's table name
func (*RefundRecord) TableName() string {
return TableNameRefundRecord
}

View File

@@ -0,0 +1,34 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package model
const TableNameSystemAuthAdmin = "la_system_auth_admin"
// SystemAuthAdmin mapped from table <la_system_auth_admin>
type SystemAuthAdmin struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` // 主键
DeptID int32 `gorm:"column:dept_id;not null;comment:部门ID" json:"dept_id"` // 部门ID
PostID int32 `gorm:"column:post_id;not null;comment:岗位ID" json:"post_id"` // 岗位ID
Username string `gorm:"column:username;not null;comment:用户账号" json:"username"` // 用户账号
Nickname string `gorm:"column:nickname;not null;comment:用户昵称" json:"nickname"` // 用户昵称
Password string `gorm:"column:password;not null;comment:用户密码" json:"password"` // 用户密码
Avatar string `gorm:"column:avatar;not null;comment:用户头像" json:"avatar"` // 用户头像
Role string `gorm:"column:role;not null;comment:角色主键" json:"role"` // 角色主键
Salt string `gorm:"column:salt;not null;comment:加密盐巴" json:"salt"` // 加密盐巴
Sort int32 `gorm:"column:sort;not null;comment:排序编号" json:"sort"` // 排序编号
IsMultipoint int32 `gorm:"column:is_multipoint;not null;comment:多端登录: 0=否, 1=是" json:"is_multipoint"` // 多端登录: 0=否, 1=是
IsDisable int32 `gorm:"column:is_disable;not null;comment:是否禁用: 0=否, 1=是" json:"is_disable"` // 是否禁用: 0=否, 1=是
IsDelete int32 `gorm:"column:is_delete;not null;comment:是否删除: 0=否, 1=是" json:"is_delete"` // 是否删除: 0=否, 1=是
LastLoginIP string `gorm:"column:last_login_ip;not null;comment:最后登录IP" json:"last_login_ip"` // 最后登录IP
LastLoginTime int32 `gorm:"column:last_login_time;not null;comment:最后登录" json:"last_login_time"` // 最后登录
CreateTime int32 `gorm:"column:create_time;not null;comment:创建时间" json:"create_time"` // 创建时间
UpdateTime int32 `gorm:"column:update_time;not null;comment:更新时间" json:"update_time"` // 更新时间
DeleteTime int32 `gorm:"column:delete_time;not null;comment:删除时间" json:"delete_time"` // 删除时间
}
// TableName SystemAuthAdmin's table name
func (*SystemAuthAdmin) TableName() string {
return TableNameSystemAuthAdmin
}

View File

@@ -9,7 +9,7 @@ const TableNameUser = "la_user"
// User mapped from table <la_user>
type User struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` // 主键
Sn int32 `gorm:"column:sn;not null;comment:编号" json:"sn"` // 编号
Sn int64 `gorm:"column:sn;not null;comment:编号" json:"sn"` // 编号
Avatar string `gorm:"column:avatar;not null;comment:头像" json:"avatar"` // 头像
RealName string `gorm:"column:real_name;not null;comment:真实姓名" json:"real_name"` // 真实姓名
Nickname string `gorm:"column:nickname;not null;comment:用户昵称" json:"nickname"` // 用户昵称
@@ -21,7 +21,7 @@ type User struct {
IsDisable int32 `gorm:"column:is_disable;not null;comment:是否禁用: [0=否, 1=是]" json:"is_disable"` // 是否禁用: [0=否, 1=是]
LoginIP string `gorm:"column:login_ip;not null;comment:最后登录IP" json:"login_ip"` // 最后登录IP
LoginTime int32 `gorm:"column:login_time;not null;comment:最后登录时间" json:"login_time"` // 最后登录时间
IsNewUser bool `gorm:"column:is_new_user;not null;comment:是否是新注册用户: [1-是, 0-否]" json:"is_new_user"` // 是否是新注册用户: [1-是, 0-否]
IsNewUser int32 `gorm:"column:is_new_user;not null;comment:是否是新注册用户: [1-是, 0-否]" json:"is_new_user"` // 是否是新注册用户: [1-是, 0-否]
UserMoney float64 `gorm:"column:user_money;default:0.00;comment:用户余额" json:"user_money"` // 用户余额
TotalRechargeAmount float64 `gorm:"column:total_recharge_amount;default:0.00;comment:累计充值" json:"total_recharge_amount"` // 累计充值
CreateTime int32 `gorm:"column:create_time;not null;comment:创建时间" json:"create_time"` // 创建时间

View File

@@ -9,19 +9,20 @@ const TableNameUserAccountLog = "la_user_account_log"
// UserAccountLog mapped from table <la_user_account_log>
type UserAccountLog struct {
ID int32 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
Sn string `gorm:"column:sn;not null;comment:流水号" json:"sn"` // 流水
UserID int32 `gorm:"column:user_id;not null;comment:用户id" json:"user_id"` // 用户id
ChangeObject int32 `gorm:"column:change_object;not null;comment:变动对象" json:"change_object"` // 变动对象
ChangeType int32 `gorm:"column:change_type;not null;comment:变动类型" json:"change_type"` // 变动类型
Action int32 `gorm:"column:action;not null;comment:动作 1-增加 2-减少" json:"action"` // 动作 1-增加 2-减少
ChangeAmount float64 `gorm:"column:change_amount;not null;comment:变动数量" json:"change_amount"` // 变动数量
LeftAmount float64 `gorm:"column:left_amount;not null;default:0.00;comment:变动后数量" json:"left_amount"` // 变动后数量
SourceSn string `gorm:"column:source_sn;comment:关联单号" json:"source_sn"` // 关联单号
Remark string `gorm:"column:remark;comment:备注" json:"remark"` // 备注
Extra string `gorm:"column:extra;comment:预留扩展字段" json:"extra"` // 预留扩展字段
CreateTime int32 `gorm:"column:create_time;comment:创建时间" json:"create_time"` // 创建时间
UpdateTime int32 `gorm:"column:update_time;comment:更新时间" json:"update_time"` // 更新时间
DeleteTime int32 `gorm:"column:delete_time;comment:删除时间" json:"delete_time"` // 删除时间
Sn int64 `gorm:"column:sn;not null;comment:用户编号" json:"sn"` // 用户编
UserID int32 `gorm:"column:user_id;not null;comment:用户id" json:"user_id"` // 用户id
ChangeObject int32 `gorm:"column:change_object;not null;comment:变动对象" json:"change_object"` // 变动对象
ChangeType int32 `gorm:"column:change_type;not null;comment:变动类型" json:"change_type"` // 变动类型
Action int32 `gorm:"column:action;not null;comment:动作 1-增加 2-减少" json:"action"` // 动作 1-增加 2-减少
ChangeAmount float64 `gorm:"column:change_amount;not null;comment:变动数量" json:"change_amount"` // 变动数量
LeftAmount float64 `gorm:"column:left_amount;not null;comment:变动后数量" json:"left_amount"` // 变动后数量
SourceSn string `gorm:"column:source_sn;comment:关联单号" json:"source_sn"` // 关联单号
Remark string `gorm:"column:remark;comment:备注" json:"remark"` // 备注
Extra string `gorm:"column:extra;comment:预留扩展字段" json:"extra"` // 预留扩展字段
CreateTime int32 `gorm:"column:create_time;comment:创建时间" json:"create_time"` // 创建时间
UpdateTime int32 `gorm:"column:update_time;comment:更新时间" json:"update_time"` // 更新时间
DeleteTime int32 `gorm:"column:delete_time;comment:删除时间" json:"delete_time"` // 删除时间
User User `gorm:"foreignKey:UserID;references:ID" json:"user"`
}
// TableName UserAccountLog's table name

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Some files were not shown because too many files have changed in this diff Show More