Browse Source

行情期限-主页面完成

milestone-20251117-DeepChart后台一期
liruiqiang 2 months ago
parent
commit
80d32a83fc
  1. 11
      src/api/userPermissions.js
  2. 376
      src/views/UserPermissions/Market.vue

11
src/api/userPermissions.js

@ -32,7 +32,7 @@ export function userMListApi(params) {
// 行情期限--操作日志
export function logMListApi(params) {
return request({
url: base_url + "/admin/market/loglist",
url: base_url + "/admin/operation/record/list",
method: "post",
data: params,
});
@ -47,6 +47,15 @@ export function exportCreateApi(params) {
});
}
// 行情期限--开通/编辑
export function exitMApi(params) {
return request({
url: base_url + "/admin/market/permission/exit",
method: "post",
data: params,
});
}
// 获取导出列表
export function exportListApi(params) {
return request({

376
src/views/UserPermissions/Market.vue

@ -78,7 +78,7 @@
<el-table-column label="操作" width="180" align="center" header-align="center">
<template #default="scope">
<el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" @click="handleLog(scope.row.id)">操作日志</el-button>
<el-button type="text" @click="handleLog(scope.row.dccode)">操作日志</el-button>
</template>
</el-table-column>
</el-table>
@ -89,18 +89,102 @@
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="10"
:page-sizes="[15, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total= "datatotal"
/>
</div>
<el-dialog v-model="dialogVisible" :title="addOrUpdata === 1 ? '添加权限' : '设置'" width="500px" :before-close="cancel">
<!-- 设置用户 -->
<div class="form-item" v-if="addOrUpdata === 1">
<label class="form-label">设置用户</label>
<el-input type="textarea" v-model="hlidsInput" rows=10
placeholder="请输入HLid...
示例
HL30454647
HL30454648
HL30454649"
/>
<div class="tip">支持批量输入每次最多1000个手动/Excel粘贴均可</div>
</div>
<!-- 编辑回显 -->
<div class="info-container" v-if="addOrUpdata === 0">
<span class="info-item">HLid{{ hlidsInput }}</span>
<span class="info-item">当前到期时间{{ deadline.split(' ')[0] }}</span>
</div>
<!-- 设置权限时间 -->
<div class="form-item">
<label class="form-label">设置权限时间</label>
<el-radio-group v-model="timeType" class="radio-group">
<el-radio label="expire" class="radio-item">
<span>到期时间</span>
<el-date-picker
v-model="expireTime"
type="date"
placeholder="请选择到期日期"
:disabled-date="disabledDate"
style="width: 220px; margin-left: 8px;"
/>
</el-radio>
<el-radio label="delay" class="radio-item">
<span>延期时间</span>
<el-input
v-model.number="delayValue"
type="number"
style="width: 60px; margin: 0 8px;"
placeholder="1"
@input="handleDelayInput"
/>
<el-select v-model="delayUnit" placeholder="请选择" style="width: 150px;">
<el-option label="年" value="year"></el-option>
<el-option label="月" value="month"></el-option>
<el-option label="周" value="week"></el-option>
<el-option label="日" value="day"></el-option>
</el-select>
</el-radio>
</el-radio-group>
</div>
<!-- 备注-->
<div class="form-item inline-form-item">
<label class="form-label">备注</label>
<el-input
type="textarea"
v-model="remark"
rows=3
placeholder="请输入备注..."
maxlength="150"
show-word-limit
/>
</div>
<!-- 操作人 -->
<div class="form-item inline-form-item">
<label class="form-label">操作人</label>
<el-input v-model="operator" placeholder="请填写操作人"/>
</div>
<!-- 按钮区域 -->
<div class="dialog-footer">
<el-button type="default" plain @click="cancel">取消</el-button>
<el-button type="primary" @click="submitForm" style="background-color: #ff0000; border-color: #ff0000;">提交</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, computed, onMounted } from 'vue';
import { marketListApi, userMListApi } from '../../api/userPermissions'
import { ref, reactive, onMounted } from 'vue';
import { ElMessage } from 'element-plus';
import { marketListApi, userMListApi, exportCreateApi, exitMApi } from '../../api/userPermissions'
import router from '../../router';
// token
const token = localStorage.getItem('token')
//
const searchForm = reactive({
@ -120,18 +204,181 @@ const tableLoading = ref(false);
const datatotal = ref(0)
//
const currentPage = ref(1); //
const pageSize = ref(10); //
const currentPage = ref(1);
const pageSize = ref(15);
//
//
const regionList = ref([]);
const isRegionLoading = ref(false);
//
const dialogVisible = ref(false);
//
const hlidsInput = ref('');
const timeType = ref('');
const expireTime = ref('');
const delayValue = ref('');
const delayUnit = ref('');
const remark = ref('');
const operator = ref('');
//
const addOrUpdata = ref(0);
//
const deadline = ref('');
// 0
const disabledDate = (time) => {
return time.getTime() < new Date().getTime() - 8.64e7;
};
//
const formatDate = (date) => {
if (!date) return '';
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}/${month}/${day}`;
};
// HLid
const checkHlids = () => {
//
if (!hlidsInput.value.trim()) {
ElMessage.error('请输入HLid');
return false;
}
//
const hlidList = hlidsInput.value.split('\n')
.map(item => item.trim())
.filter(item => item)
.filter((item, index, self) => self.indexOf(item) === index); //
// 1000
if (hlidList.length > 1000) {
ElMessage.error('HLid数量不能超过1000个');
return false;
}
// HL+8
const hlidReg = /^DC\d{8}$/;
for (const hlid of hlidList) {
if (!hlidReg.test(hlid)) {
ElMessage.error(`HLid格式错误:${hlid},请重新输入`);
return false;
}
}
return true;
};
//
const checkTime = () => {
if (timeType.value === 'expire') {
//
//
if (!expireTime.value) {
ElMessage.error('请选择到期时间');
return false;
}
} else if (timeType.value === 'delay') {
//
//
if (!delayValue.value || !delayUnit.value) {
ElMessage.error('延期时间必须填写完整(数值+单位)');
return false;
}
} else {
ElMessage.error('请设置权限时间');
return false;
}
return true;
};
//
const handleDelayInput = () => {
if (delayValue.value !== null && delayValue.value !== undefined) {
delayValue.value = Math.floor(delayValue.value);
}
};
//
const checkRemark = () => {
if (!remark.value.trim()) {
ElMessage.error('请输入备注');
return false;
}
return true;
};
//
const submitForm = async () => {
//
if (!checkHlids() || !checkTime() || !checkRemark()) {
return;
}
try {
//
const requestParams = {
token: token,
// HLid
hlids: hlidsInput.value.split('\n')
.map(item => item.trim())
.filter(item => item)
.join('\n'),
//
remark: remark.value.trim(),
//
...(operator.value.trim() && { operator: operator.value.trim() }),
//
...(timeType.value === 'expire'
? { expire_time: formatDate(expireTime.value) }
: {
[delayUnit.value]: Number(delayValue.value)
})
};
console.log('传给后端的参数:', requestParams);
//
const res = await exitMApi(requestParams);
ElMessage.success('成功添加用户权限');
//
resetForm();
dialogVisible.value = false;
addOrUpdata.value = 0;
//
fetchTableData();
} catch (error) {
ElMessage.error('添加权限失败,请重试');
}
};
//
const cancel = () => {
resetForm();
dialogVisible.value = false;
addOrUpdata.value = 0;
};
//
const resetForm = () => {
hlidsInput.value = '';
timeType.value = '';
expireTime.value = '';
delayValue.value = '';
delayUnit.value = '';
remark.value = '';
operator.value = '';
};
//
const fetchRegionList = async () => {
try {
isRegionLoading.value = true;
const data = await marketListApi();
const data = await marketListApi({token: token});
regionList.value = data.list;
} catch (error) {
console.error('获取地区列表失败:', error);
@ -146,6 +393,7 @@ const fetchTableData = async () => {
try {
tableLoading.value = true;
const requestParams = {
token: token,
dccode: searchForm.dccode,
dcname: searchForm.dcname,
market: searchForm.market,
@ -161,6 +409,7 @@ const fetchTableData = async () => {
} catch (error) {
console.error('获取表格数据失败:', error);
tableData.value = [];
datatotal.value = 0
} finally {
tableLoading.value = false;
}
@ -180,17 +429,32 @@ const search = () => {
//
const enableAccess = () => {
console.log('开通权限操作');
dialogVisible.value = true;
addOrUpdata.value = 1;
};
// Excel
const exportExcel = () => {
console.log('导出Excel列表');
const exportExcel = async () => {
const requestParams = {
token: token,
dccode: searchForm.dccode,
dcname: searchForm.dcname,
market: searchForm.market,
register_type: searchForm.register_type,
sort_field: sortProp.value,
sort_order: sortOrder.value
};
const data = await exportCreateApi(requestParams);
if (data != '') {
ElMessage.success('已导出');
}
};
//
const exportList = () => {
console.log('查看导出列表');
router.push({
path: "/userPermissions/export"
});
};
//
@ -208,12 +472,17 @@ const resetBn = () => {
//
const handleEdit = (row) => {
console.log('编辑用户:', row);
dialogVisible.value = true;
hlidsInput.value = row.dccode;
deadline.value = row.expire_time;
};
//
const handleLog = (id) => {
console.log('操作日志:', id);
const handleLog = (dccode) => {
router.push({
path: "/userPermissions/logMarket",
query: { dccode: dccode }
});
};
//
@ -232,8 +501,8 @@ const handleCurrentChange = (val) => {
//
const handleSortChange = (sort) => {
const { prop, order } = sort;
// created_atexpire_time
//
if (!['created_at', 'expire_time'].includes(prop)) return;
//
@ -290,6 +559,7 @@ const handleSortChange = (sort) => {
font-size: 15px;
text-align: left;
color: #333;
margin-top: 13px;
}
/* 按钮组 */
@ -351,4 +621,74 @@ const handleSortChange = (sort) => {
background: #FEFBFB;
box-sizing: border-box;
}
/* 添加/修改样式 */
.form-item {
margin-bottom: 24px;
padding-left: 20px;
padding-right: 20px;
text-align: left;
}
.form-label {
display: block;
margin-bottom: 8px;
font-weight: 500;
}
.radio-group {
display: flex;
flex-direction: column;
gap: 12px;
align-items: flex-start;
}
.radio-item {
display: flex;
align-items: center;
}
.radio-item span {
margin-right: 8px;
}
.tip {
font-size: 12px;
color: #909399;
margin-top: 4px;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 16px;
margin-top: 20px;
}
.inline-form-item {
display: flex;
align-items: flex-start;
gap: 12px;
}
.inline-form-item .form-label {
display: inline-block;
margin-bottom: 0;
width: 60px;
text-align: left;
padding-right: 12px;
}
.info-container {
display: flex;
align-items: center;
gap: 40px;
padding: 0 20px 18px;
color: #333;
font-size: 16px;
}
.info-item {
white-space: nowrap;
}
</style>
Loading…
Cancel
Save