✨ feat(卡密): 添加 搜索 删除
This commit is contained in:
parent
758d727306
commit
5dccf37ebd
12
admin/src/addon/carmi/api/test.ts
Normal file
12
admin/src/addon/carmi/api/test.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function add(params:Record<string, any>) {
|
||||||
|
return request.post(`carmi/add`,params)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function get(params:Record<string, any>) {
|
||||||
|
return request.post(`carmi/get`,params)
|
||||||
|
}
|
||||||
|
export function del(params:Record<string, any>) {
|
||||||
|
return request.post(`carmi/del`,params)
|
||||||
|
}
|
|
@ -1,16 +1,197 @@
|
||||||
<template>
|
<template>
|
||||||
<t-button theme="default" variant="base">填充按钮</t-button>
|
<t-row :gutter="6">
|
||||||
|
<t-col :span="3">
|
||||||
|
<t-input-adornment prepend="订单号">
|
||||||
|
<t-input v-model="order" style="width:100%;"/>
|
||||||
|
</t-input-adornment>
|
||||||
|
</t-col>
|
||||||
|
<t-col :span="3">
|
||||||
|
<t-input-adornment prepend="创建时间">
|
||||||
|
<t-date-picker v-model="date" style="width: 100%;" />
|
||||||
|
</t-input-adornment>
|
||||||
|
</t-col>
|
||||||
|
<t-col :span="3">
|
||||||
|
<t-input-adornment prepend="激活状态">
|
||||||
|
<t-select
|
||||||
|
style="width: 100%;"
|
||||||
|
v-model="state"
|
||||||
|
:options="optionsState"
|
||||||
|
clearable
|
||||||
|
></t-select>
|
||||||
|
</t-input-adornment>
|
||||||
|
</t-col>
|
||||||
|
<t-col >
|
||||||
|
<t-button @click="search">搜索</t-button>
|
||||||
|
<t-button theme="default" @click="reset">重置</t-button>
|
||||||
|
</t-col>
|
||||||
|
</t-row>
|
||||||
|
<t-button @click="visible1 = true">添加</t-button>
|
||||||
|
<t-button theme="default" @click="refresh">刷新</t-button>
|
||||||
|
<t-table
|
||||||
|
row-key="id"
|
||||||
|
:data="data"
|
||||||
|
bordered
|
||||||
|
:columns="columns"
|
||||||
|
:loading="loadingTable"
|
||||||
|
:pagination="pagination"
|
||||||
|
:disableDataPage="true"
|
||||||
|
@page-change="onPageChange">
|
||||||
|
<template #type="{row}">
|
||||||
|
{{ row.type === 0 ? '进件特约商户' : row.type === 1 ? '小程序注册' : '小程序备案' }}
|
||||||
|
</template>
|
||||||
|
<template #state="{row}">
|
||||||
|
{{ row.state === 0 ? '未激活' : '已激活' }}
|
||||||
|
</template>
|
||||||
|
<template #op="{row}">
|
||||||
|
<t-button theme="danger" size="small" variant="base" @click="del(row.id)">删除</t-button>
|
||||||
|
</template>
|
||||||
|
</t-table>
|
||||||
|
<t-dialog
|
||||||
|
v-model:visible="visible1"
|
||||||
|
header="添加"
|
||||||
|
:on-close="null"
|
||||||
|
:cancel-btn="null"
|
||||||
|
confirm-btn="确认"
|
||||||
|
@confirm="onClickConfirm"
|
||||||
|
>
|
||||||
|
<t-input-adornment prepend="激活类型">
|
||||||
|
<t-select
|
||||||
|
v-model="type"
|
||||||
|
:options="options"
|
||||||
|
clearable
|
||||||
|
></t-select>
|
||||||
|
</t-input-adornment>
|
||||||
|
<t-input-adornment prepend="生成数量">
|
||||||
|
<t-input v-model="nums" type="number" />
|
||||||
|
</t-input-adornment>
|
||||||
|
</t-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue'
|
import { ref,onMounted } from 'vue'
|
||||||
import { getHelloWorld } from '@/addon/carmi/api/hello_world'
|
import { PageInfo,MessagePlugin,DialogPlugin } from 'tdesign-vue-next';
|
||||||
|
import { add,get,del as deleteItem } from '@/addon/carmi/api/test'
|
||||||
|
|
||||||
const hello_world_text = ref('');
|
// 删除
|
||||||
const getHelloWorldInfo = async () => {
|
const del = (val:number)=>{
|
||||||
hello_world_text.value = await (await getHelloWorld()).data
|
const confirmDia = DialogPlugin({
|
||||||
|
header: '提示',
|
||||||
|
body:'确认删除数据吗?',
|
||||||
|
width:'20%',
|
||||||
|
onConfirm: async () => {
|
||||||
|
const res = await deleteItem({id:val})
|
||||||
|
MessagePlugin.success('删除成功')
|
||||||
|
init()
|
||||||
|
confirmDia.hide();
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
getHelloWorldInfo()
|
|
||||||
|
// 订单号
|
||||||
|
const order = ref('')
|
||||||
|
// 创建时间
|
||||||
|
const date = ref()
|
||||||
|
// 激活状态
|
||||||
|
const state = ref()
|
||||||
|
const optionsState = [
|
||||||
|
{
|
||||||
|
value:0,
|
||||||
|
label:'未激活'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value:1,
|
||||||
|
label:'已激活'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
// 搜索
|
||||||
|
const search = ()=>{
|
||||||
|
init({
|
||||||
|
number: order.value,
|
||||||
|
create_time: date.value,
|
||||||
|
state: state.value,
|
||||||
|
page: pagination.value.defaultCurrent,
|
||||||
|
limit: pagination.value.defaultPageSize
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 重置
|
||||||
|
const reset = ()=>{
|
||||||
|
order.value =''
|
||||||
|
}
|
||||||
|
interface PARAMS {
|
||||||
|
number?:string,
|
||||||
|
create_time?:string,
|
||||||
|
state?:number,
|
||||||
|
page:number,
|
||||||
|
limit:number
|
||||||
|
}
|
||||||
|
const data = ref([])
|
||||||
|
const loadingTable = ref(false)
|
||||||
|
const init =async (params:PARAMS = {
|
||||||
|
page: pagination.value.defaultCurrent,
|
||||||
|
limit: pagination.value.defaultPageSize
|
||||||
|
}) => {
|
||||||
|
loadingTable.value = true
|
||||||
|
|
||||||
|
const res = await get(params)
|
||||||
|
loadingTable.value = false
|
||||||
|
data.value = res.data.data
|
||||||
|
pagination.value.total = res.data.total
|
||||||
|
MessagePlugin.success('获取成功!')
|
||||||
|
}
|
||||||
|
onMounted(()=>{
|
||||||
|
init()
|
||||||
|
})
|
||||||
|
const refresh = ()=>{
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
const options = [
|
||||||
|
{
|
||||||
|
label:'进件',value:0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label:'小程序注册',value:1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label:'小程序备案',value:2
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
const visible1 = ref(false)
|
||||||
|
const type = ref(0)
|
||||||
|
const nums = ref(1)
|
||||||
|
const onClickConfirm = async ()=>{
|
||||||
|
if(nums.value > 0){
|
||||||
|
const res = await add({type:type.value,nums:nums.value})
|
||||||
|
visible1.value = false
|
||||||
|
MessagePlugin.success('添加成功')
|
||||||
|
init()
|
||||||
|
console.log(res);
|
||||||
|
type.value = 0
|
||||||
|
nums.value = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const pagination = ref({
|
||||||
|
defaultCurrent: 1,
|
||||||
|
defaultPageSize: 10,
|
||||||
|
total:0,
|
||||||
|
});
|
||||||
|
const onPageChange = (val:PageInfo)=>{
|
||||||
|
pagination.value.defaultCurrent = val.current
|
||||||
|
pagination.value.defaultPageSize = val.pageSize
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
const columns = ref([
|
||||||
|
{ colKey: 'create_time', title: '创建时间', width: '200',align:'center' },
|
||||||
|
{colKey: 'type',title: '激活类型',width: '130',align:'center'},
|
||||||
|
{ colKey: 'code', title: '激活码',width: '200',align:'center' },
|
||||||
|
{ colKey: 'state', title: '激活状态',width: '100',align:'center'},
|
||||||
|
{ colKey: 'number', title: '订单号',width: '200',align:'center' },
|
||||||
|
{ colKey: 'update_time', title: '更新时间', width: '200',align:'center'},
|
||||||
|
{ colKey: 'op', title: '操作', width: '100',align:'center'},
|
||||||
|
]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|
|
@ -9,7 +9,16 @@ import { useElementIcon } from './utils/common'
|
||||||
import 'highlight.js/styles/stackoverflow-light.css';
|
import 'highlight.js/styles/stackoverflow-light.css';
|
||||||
import hljs from 'highlight.js/lib/common'
|
import hljs from 'highlight.js/lib/common'
|
||||||
import hljsVuePlugin from '@highlightjs/vue-plugin'
|
import hljsVuePlugin from '@highlightjs/vue-plugin'
|
||||||
import { Button as TButton } from 'tdesign-vue-next';
|
import { Button as TButton,
|
||||||
|
Table as TTable,
|
||||||
|
Dialog as TDialog,
|
||||||
|
Select as TSelect,
|
||||||
|
InputAdornment as TInputAdornment,
|
||||||
|
Input as TInput,
|
||||||
|
Row as TRow,
|
||||||
|
Col as TCol,
|
||||||
|
DatePicker as TDatePicker
|
||||||
|
} from 'tdesign-vue-next';
|
||||||
import 'tdesign-vue-next/es/style/index.css';
|
import 'tdesign-vue-next/es/style/index.css';
|
||||||
|
|
||||||
window.hl = hljs
|
window.hl = hljs
|
||||||
|
@ -23,6 +32,14 @@ async function run() {
|
||||||
app.use(hljsVuePlugin)
|
app.use(hljsVuePlugin)
|
||||||
useElementIcon(app)
|
useElementIcon(app)
|
||||||
app.use(TButton)
|
app.use(TButton)
|
||||||
|
app.use(TTable)
|
||||||
|
app.use(TDialog)
|
||||||
|
app.use(TSelect)
|
||||||
|
app.use(TInputAdornment)
|
||||||
|
app.use(TInput)
|
||||||
|
app.use(TRow)
|
||||||
|
app.use(TCol)
|
||||||
|
app.use(TDatePicker)
|
||||||
app.mount('#app')
|
app.mount('#app')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
54
niucloud/addon/carmi/app/adminapi/controller/carmi/index.php
Normal file
54
niucloud/addon/carmi/app/adminapi/controller/carmi/index.php
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
namespace addon\carmi\app\adminapi\controller\carmi;
|
||||||
|
|
||||||
|
use core\base\BaseAdminController;
|
||||||
|
use think\Response;
|
||||||
|
use addon\carmi\app\model\Test;
|
||||||
|
use addon\carmi\app\service\CarmiService;
|
||||||
|
|
||||||
|
class Index extends BaseAdminController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 添加卡密
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public function add()
|
||||||
|
{
|
||||||
|
$data =$this->request->params([
|
||||||
|
['type', 0],
|
||||||
|
['nums', 1],
|
||||||
|
]);
|
||||||
|
$msg = new CarmiService();
|
||||||
|
$result = $msg->add($data);
|
||||||
|
if($result){
|
||||||
|
return success('ADD_SUCCESS', []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 搜索卡密
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public function get()
|
||||||
|
{
|
||||||
|
$data = $this->request->params([
|
||||||
|
['number', ''],
|
||||||
|
['state', ""],
|
||||||
|
['create_time', 0],
|
||||||
|
]);
|
||||||
|
$msg = new CarmiService();
|
||||||
|
return success($msg->get($data));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public function del()
|
||||||
|
{
|
||||||
|
$data = $this->request->params([
|
||||||
|
['id','']
|
||||||
|
]);
|
||||||
|
if((new CarmiService())->del($data['id'])){
|
||||||
|
return Response::create(['data' => [$data], 'msg' => '删除成功', 'code' => 1], 'json', 200);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,7 +22,9 @@ Route::group('carmi', function () {
|
||||||
|
|
||||||
/***************************************************** hello world ****************************************************/
|
/***************************************************** hello world ****************************************************/
|
||||||
Route::get('hello_world', 'addon\carmi\app\adminapi\controller\hello_world\Index@index');
|
Route::get('hello_world', 'addon\carmi\app\adminapi\controller\hello_world\Index@index');
|
||||||
|
Route::post('add', 'addon\carmi\app\adminapi\controller\carmi\Index@add');
|
||||||
|
Route::post('get', 'addon\carmi\app\adminapi\controller\carmi\Index@get');
|
||||||
|
Route::post('del', 'addon\carmi\app\adminapi\controller\carmi\Index@del');
|
||||||
})->middleware([
|
})->middleware([
|
||||||
AdminCheckToken::class,
|
AdminCheckToken::class,
|
||||||
AdminCheckRole::class,
|
AdminCheckRole::class,
|
||||||
|
|
27
niucloud/addon/carmi/app/model/Test.php
Normal file
27
niucloud/addon/carmi/app/model/Test.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
namespace addon\carmi\app\model;
|
||||||
|
|
||||||
|
use core\base\BaseModel;
|
||||||
|
|
||||||
|
class Test extends BaseModel
|
||||||
|
{
|
||||||
|
public function searchNumberAttr($query, $value, $data)
|
||||||
|
{
|
||||||
|
if ($value) {
|
||||||
|
$query->where('number','like', '%'.$value . '%');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function searchCreateTimeAttr($query, $value, $data)
|
||||||
|
{
|
||||||
|
if ($value) {
|
||||||
|
$timestamp = strtotime($value);
|
||||||
|
$query->where([['create_time', '>=', $timestamp]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function searchStateAttr($query, $value, $data)
|
||||||
|
{
|
||||||
|
if($value == 0 || $value == 1 ){
|
||||||
|
$query->where([['state', '=', $value]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
71
niucloud/addon/carmi/app/service/CarmiService.php
Normal file
71
niucloud/addon/carmi/app/service/CarmiService.php
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
<?php
|
||||||
|
namespace addon\carmi\app\service;
|
||||||
|
|
||||||
|
use core\base\BaseAdminService;
|
||||||
|
use addon\carmi\app\model\Test;
|
||||||
|
use think\Response;
|
||||||
|
|
||||||
|
class CarmiService extends BaseAdminService
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->model = new Test();
|
||||||
|
}
|
||||||
|
// 添加
|
||||||
|
public function add(array $data)
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
for ($x=0; $x<$data['nums']; $x++) {
|
||||||
|
$item=[
|
||||||
|
"state"=>0,
|
||||||
|
"number"=>$this->generateOrderNumber(),
|
||||||
|
"code"=>$this->generateActivationCode(18),
|
||||||
|
"type"=>intval($data['type'])
|
||||||
|
];
|
||||||
|
array_push($list,$item);
|
||||||
|
}
|
||||||
|
return $this->model->saveAll($list);
|
||||||
|
}
|
||||||
|
// 获取列表
|
||||||
|
public function get(array $where = [])
|
||||||
|
{
|
||||||
|
$search_model = $this->model->withSearch(['number','create_time','state'],$where)->order('create_time desc');
|
||||||
|
return $this->pageQuery($search_model);
|
||||||
|
}
|
||||||
|
// 删除
|
||||||
|
public function del(int $id)
|
||||||
|
{
|
||||||
|
return $this->model->find($id)->delete();
|
||||||
|
}
|
||||||
|
// 生成订单号
|
||||||
|
function generateOrderNumber() {
|
||||||
|
$microtime = microtime(true);
|
||||||
|
$microtimeStr = str_replace('.', '', (string)$microtime); // 移除小数点
|
||||||
|
$uniqidPart = substr(uniqid(), -8); // 或者 substr(uniqid(), 7, 8) 去除前缀
|
||||||
|
return date('Ymd') . substr($microtimeStr, -6) . $uniqidPart;
|
||||||
|
}
|
||||||
|
// 生成激活码
|
||||||
|
// 使用 uniqid() 函数结合微秒时间戳获取基础唯一标识符
|
||||||
|
function generateActivationCode($length = 32) {
|
||||||
|
$uniqidPart = bin2hex(openssl_random_pseudo_bytes(16)); // 或者使用 uniqid('', true)
|
||||||
|
|
||||||
|
// 可选:添加额外的安全性,如用户ID或其它上下文信息(如果适用)
|
||||||
|
// $userId = get_current_user_id(); // 假设这是一个获取当前用户ID的方法
|
||||||
|
// $contextInfo = hash('sha256', $userId . time());
|
||||||
|
// $activationBase = $uniqidPart . $contextInfo;
|
||||||
|
|
||||||
|
// 直接使用 uniqidPart
|
||||||
|
$activationBase = $uniqidPart;
|
||||||
|
|
||||||
|
// 使用安全的哈希函数进一步处理,例如 SHA-256
|
||||||
|
$activationCode = hash('sha256', $activationBase);
|
||||||
|
|
||||||
|
// 如果需要特定长度的激活码,可以截取哈希值的一部分或者用更短的哈希函数
|
||||||
|
if ($length > 0 && $length < strlen($activationCode)) {
|
||||||
|
$activationCode = substr($activationCode, 0, $length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return strtoupper($activationCode); // 返回大写字符串形式的激活码
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user