main
parent
f0943410a6
commit
10eaf22595
@ -0,0 +1,50 @@
|
||||
import request from "../utils/request";
|
||||
|
||||
// 获取轮播列表
|
||||
export function getCarouselListApi(page, limit = 10) {
|
||||
return request({
|
||||
url: `/admin/banner/${page}/${limit}`,
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
|
||||
// 保存轮播
|
||||
export function saveCarouselApi(data) {
|
||||
return request({
|
||||
url: `/admin/banner/save`,
|
||||
method: "post",
|
||||
data: { img: data.img,title: data.title,status: data.status }
|
||||
});
|
||||
}
|
||||
|
||||
// 删除轮播
|
||||
export function deleteCarouselApi(id) {
|
||||
return request({
|
||||
url: `/admin/banner/remove/${id}`,
|
||||
method: "delete",
|
||||
});
|
||||
}
|
||||
|
||||
// 修改轮播
|
||||
export function updateCarouselApi(data) {
|
||||
return request({
|
||||
url: `/admin/banner/update`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 上传图片
|
||||
export function uploadImageApi(file) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
return request({
|
||||
url: '/admin/cms/upload',
|
||||
method: 'post',
|
||||
data: formData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
import request from "../utils/request";
|
||||
|
||||
// 获取内容列表
|
||||
export function getContentListApi(page, limit = 10,classify) {
|
||||
return request({
|
||||
url: `/admin/cms/${page}/${limit}?classify=${classify}`,
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
|
||||
// 新增内容
|
||||
export function saveContentApi(data) {
|
||||
return request({
|
||||
url: `/admin/cms/save`,
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 更新内容
|
||||
export function updateContentApi(data) {
|
||||
return request({
|
||||
url: `/admin/cms/update`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 删除内容
|
||||
export function deleteContentApi(id) {
|
||||
return request({
|
||||
url: `/admin/cms/remove/${id}`,
|
||||
method: "delete",
|
||||
});
|
||||
}
|
||||
|
||||
// 上传图片
|
||||
export function uploadImageApi(file) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
return request({
|
||||
url: '/admin/cms/upload',
|
||||
method: 'post',
|
||||
data: formData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,661 +0,0 @@
|
||||
<template>
|
||||
<!--我的职位-->
|
||||
<div class="p-manage-myJob">
|
||||
<div class="m-select g_flex_row_between g_pt_16">
|
||||
<div class="g_flex_row_start">
|
||||
<div class="g_w_320 g-search-btn g_mr_16">
|
||||
<a-input-search v-model:value="tableData.keyword" placeholder="请输入姓名" @search="searchList" @change="handleChangeSearch" allowClear />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
<!-- <a-button type="primary" @click="openAdd" :icon="h(PlusOutlined)">新增用户</a-button> -->
|
||||
<!-- <a-button type="" class="g_border_d g_ml_16" @click="handleToForm('add', { id: 0 })" :icon="h(DownloadOutlined)">导出模版</a-button> -->
|
||||
<!--
|
||||
<a-dropdown :trigger="['click']">
|
||||
<template #overlay>
|
||||
<a-menu>
|
||||
<a-menu-item key="1" @click="goShareList">共享职位</a-menu-item>
|
||||
<a-menu-item key="2" @click="handleToForm('add',{id:0})">自有职位</a-menu-item>
|
||||
</a-menu>
|
||||
</template>
|
||||
<a-button>
|
||||
新增职位
|
||||
<DownOutlined style="zoom:.8" />
|
||||
</a-button>
|
||||
</a-dropdown> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-table g_mt_20 antd-table">
|
||||
<a-table sticky :columns="columns" :scroll="{x:1000}" :data-source="tableData.records" size="middle" :pagination="false" :loading="tableData.loading" class="g_clear_scroll" style="max-width: calc(100% - 0px)">
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.key === 'job'">
|
||||
<!-- @click="goDetail(record)" -->
|
||||
<div class="btn g_fs_14 g_cursor_point g_mr_13 g_flex_row_start">
|
||||
<div class="g_ell_1">{{ "" }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="column.key === 'age'">
|
||||
<div class="g_ell_1">{{ record.sex + " " + record.age }}</div>
|
||||
</template>
|
||||
<template v-if="column.key === 'price'">
|
||||
<!-- <div v-html="record.price"></div> -->
|
||||
</template>
|
||||
<template v-if="column.key === 'status'">
|
||||
<a-switch @change="(e) => handleStatus(e, record)" :checked="record.status == 1 ? true : false" checked-children="正常" un-checked-children="禁用" />
|
||||
</template>
|
||||
|
||||
<template v-if="column.key === 'state'">
|
||||
<div class="g_flex_row_between">
|
||||
<!-- <div
|
||||
class="btn g_fs_14 g_mr_13"
|
||||
:class="'g_c_main g_cursor_point'"
|
||||
:style="{
|
||||
cursor: !record.statusBool ? 'not-allowed' : '',
|
||||
color: !record.statusBool ? '#d8d8d8' : '#1677ff',
|
||||
}"
|
||||
@click="handleApplication(record)"
|
||||
>
|
||||
报名
|
||||
</div> -->
|
||||
<div class="btn g_c_main g_fs_14 g_cursor_point g_mr_13" @click="handleViewDetail(record)">预览</div>
|
||||
|
||||
<div class="btn g_c_main g_fs_14 g_cursor_point" @click="handleToForm('edit', record)">编辑</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
<!-- <template #summary class="fixed-obj">
|
||||
<div style="width: 70vw" class="g_pb_16 g_pt_16">
|
||||
<a-table-summary fixed="bottom"> </a-table-summary>
|
||||
</div>
|
||||
</template> -->
|
||||
</a-table>
|
||||
<div class="g_pb_16 g_pt_16 g_pageBottom" v-if="tableData.records.length > 0">
|
||||
<a-pagination v-model:current="tableData.page" v-model:page-size="tableData.size" :total="tableData.total" :pageSize="tableData.size" :show-total="(total) => `共 ${total} 条`" @change="handleModalPage" @showSizeChange="handleModalSize" :show-quick-jumper="tableData.total < tableData.size ? false : true" :showSizeChanger="tableData.total < tableData.size ? false : true" :hideOnSinglePage="false" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- <a-modal v-model:open="modalInfo.isShow"
|
||||
:title="modalInfo.title"
|
||||
width="640px"
|
||||
centered
|
||||
:destroyOnClose="true"
|
||||
:forceRender="true"
|
||||
>
|
||||
<div class="g_pt_30 modal-box">
|
||||
<a-form :model="modalInfo.form"
|
||||
name="basic"
|
||||
:label-col="{ span: 6 }"
|
||||
:wrapper-col="{ span: 18 }"
|
||||
autocomplete="off"
|
||||
style="width: 80%;"
|
||||
class="g_ml_51"
|
||||
>
|
||||
<a-form-item label="职位要求标签" name="name" required>
|
||||
<a-input style="width: 100%" placeholder="请输入职位要求标签" v-model:value="modalInfo.form.name" />
|
||||
</a-form-item>
|
||||
<a-form-item label="标签类型" name="typeClassify" required>
|
||||
<a-select v-model:value="modalInfo.form.typeClassify"
|
||||
:getPopupContainer="(triggerNode) => triggerNode.parentNode.parentNode"
|
||||
placeholder="请选择职位分类"
|
||||
@change="handleUpdateSelect"
|
||||
>
|
||||
<a-select-option v-for="item in typeClassifyList" :value="item.id" :title="item.id">{{ item.name }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
<a-form-item label="说明" name="desp">
|
||||
<a-textarea :rows='6' style="width: 100%" placeholder="请输入职位说明" v-model:value="modalInfo.form.desp" />
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</div>
|
||||
<template #footer>
|
||||
<a-button @click="modalInfo.isShow = false">关闭</a-button>
|
||||
<a-button @click="submitForm" type="primary">确定</a-button>
|
||||
</template>
|
||||
</a-modal> -->
|
||||
<a-modal destroyOnClose ref="modalRef" v-model:open="tableDetail.isShow" title="持股详情" width="1200px" :bodyStyle="{ 'border-radius': '4px'}">
|
||||
<div class="g_pt_8 g_pb_16" style=" overflow-y: auto">
|
||||
<div class="g_float_right">
|
||||
<a href="//a.matripe.com.cn/api_stock/admin/user/stock/record/download">
|
||||
<a-button class="g_mr_12">
|
||||
<template #icon>
|
||||
<DownloadOutlined />
|
||||
</template>
|
||||
导出模板
|
||||
</a-button>
|
||||
</a>
|
||||
<a-upload :action="baseUrl + '/admin/user/stock/record/import'" :data="{userId}" accept=".xlsx, .xls, .xlsm, .xltx, .xltm" @change="getMoreInfo">
|
||||
<a-button type="primary"><PlusOutlined />导入文件</a-button>
|
||||
</a-upload>
|
||||
</div>
|
||||
<div class="g_float_none"></div>
|
||||
|
||||
<div class="g_mt_16 g_clear_scroll" style="max-height: calc(100vh - 464px); overflow-y: auto">
|
||||
<a-table :columns="tableDetail.columns" :data-source="tableDetail.list" size="middle" :pagination="false">
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.key === 'rank'">
|
||||
<span>{{ record.rank }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
</div>
|
||||
<div class="g_mt_20">
|
||||
<a-pagination v-model:current="tableDetail.page" v-model:page-size="tableDetail.size" :total="tableDetail.count" :pageSize="tableDetail.size" :show-total="(total) => `共 ${total} 条`" @change="handleModalDetailPage" @showSizeChange="handleModalDetailSize" :show-quick-jumper="tableDetail.count < tableDetail.size ? false : true" :showSizeChanger="tableDetail.count < tableDetail.size ? false : true" :hideOnSinglePage="false" />
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<a-button @click="tableDetail.isShow = false" type="primary">确定</a-button>
|
||||
</template>
|
||||
</a-modal>
|
||||
|
||||
|
||||
|
||||
<a-modal v-model:open="showAdd" :title="modalInfo.title" style="width: 734px" :destroyOnClose="true">
|
||||
<div class="g_pt_30 modal-box">
|
||||
<a-form :model="modalInfo.form"
|
||||
name="basic"
|
||||
:label-col="{ span: 6 }"
|
||||
:wrapper-col="{ span: 18 }"
|
||||
autocomplete="off"
|
||||
style="width: 80%;"
|
||||
class="g_ml_51"
|
||||
>
|
||||
<a-form-item label="姓名" name="name" required>
|
||||
<span class="ant-form-text">{{modalInfo.form.name}}</span>
|
||||
<!-- <a-input style="width: 100%" placeholder="请输入姓名" v-model:value="modalInfo.form.name" /> -->
|
||||
<!-- <a-select ref="select" v-model:value="modalInfo.form.name" placeholder="请选择用户" @focus="focus" @change="handleChange">
|
||||
<a-select-option v-for="item in userList" :value="item.id" :title="item.id">{{ item.name }}</a-select-option>
|
||||
</a-select> -->
|
||||
</a-form-item>
|
||||
<a-form-item label="持股数" name="num" required>
|
||||
<a-input style="width: 100%" placeholder="请输入持股数" v-model:value="modalInfo.form.num" />
|
||||
</a-form-item>
|
||||
<a-form-item label="持股比例" name="percent" required>
|
||||
<a-input style="width: 100%" placeholder="请输入持股比例" v-model:value="modalInfo.form.percent" />
|
||||
</a-form-item>
|
||||
<a-form-item label="持股价值(元)" name="amount" required>
|
||||
<a-input style="width: 100%" placeholder="请输入持股价值" v-model:value="modalInfo.form.amount" />
|
||||
</a-form-item>
|
||||
|
||||
<!-- <a-form-item label="备注" name="desp">
|
||||
<a-textarea :rows='6' style="width: 100%" placeholder="请输入备注" v-model:value="modalInfo.form.description" />
|
||||
</a-form-item> -->
|
||||
</a-form>
|
||||
</div>
|
||||
<template #footer>
|
||||
<a-button @click="showAdd = false" >关闭</a-button>
|
||||
<a-button @click="submitForm" type="primary">确定</a-button>
|
||||
</template>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import request from "../../utils/request"; // 引入基础路径
|
||||
import { ref, onMounted, getCurrentInstance, h, watch } from "vue";
|
||||
import { PlusOutlined, EllipsisOutlined, UploadOutlined, DownOutlined } from "@ant-design/icons-vue";
|
||||
import { Modal, message } from "ant-design-vue";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import { getUserListApi, updateUserStatusApi, addUserApi, delUserApi,updateUserStockApi,getStockUserListApi,addStockUserApi, getUserMoreListApi} from "../../api/userList/userList";
|
||||
import { DownloadOutlined } from "@ant-design/icons-vue";
|
||||
import idCardPanel from "../components/upload/image.vue";
|
||||
|
||||
/* #################### 初始化事件 #################### */
|
||||
const router = useRouter(); // 应用路由
|
||||
const route = useRoute();
|
||||
const commonJS = getCurrentInstance().appContext.app.config.globalProperties.G;
|
||||
const speed = ref(0);
|
||||
const showAdd = ref(0);
|
||||
const userList = ref([]);
|
||||
const userId = ref(0);
|
||||
let baseUrl = ref(request.userCustom);
|
||||
|
||||
const handleChange = value => {
|
||||
console.log(`selected ${value}`);
|
||||
modalInfo.value.form.userId = value
|
||||
};
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
getTable();
|
||||
});
|
||||
|
||||
const tableDetail = ref({
|
||||
page: 1,
|
||||
size: 50,
|
||||
count: 0,
|
||||
list: [],
|
||||
speed: -1,
|
||||
isShow: false,
|
||||
keys: "",
|
||||
columns: [],
|
||||
pagination: {},
|
||||
});
|
||||
|
||||
|
||||
const handleViewDetail = (item) => {
|
||||
// 打开明细弹窗
|
||||
tableDetail.value = {
|
||||
page: 1,
|
||||
size: 20,
|
||||
limit: 20,
|
||||
count: 0,
|
||||
list: [],
|
||||
speed: -1,
|
||||
isShow: true,
|
||||
keys: "",
|
||||
columns: [],
|
||||
pagination: {},
|
||||
};
|
||||
userId.value = item.userId
|
||||
|
||||
// itemData.value = {
|
||||
// userId: item.id,
|
||||
// agencyTeamId: item.agencyTeamId,
|
||||
// };
|
||||
getModalDetail();
|
||||
};
|
||||
|
||||
const getModalDetail = () => {
|
||||
|
||||
tableDetail.value.columns = [
|
||||
{
|
||||
title: "序号",
|
||||
key: "rank",
|
||||
dataIndex: "rank",
|
||||
width: "50px",
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: "取得方式",
|
||||
key: "sourceFrom",
|
||||
dataIndex: "sourceFrom",
|
||||
ellipsis: true,
|
||||
minWidth: "100px",
|
||||
},
|
||||
{
|
||||
title: "持股主体",
|
||||
key: "name",
|
||||
dataIndex: "name",
|
||||
width: "240px",
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: "持股数量",
|
||||
key: "num",
|
||||
dataIndex: "num",
|
||||
width: "200px",
|
||||
ellipsis: true,
|
||||
},
|
||||
];
|
||||
|
||||
getUserMoreList();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 搜索事件
|
||||
*/
|
||||
const searchList = (e) => {
|
||||
console.log("searchList", e);
|
||||
tableData.value.page = 1;
|
||||
getTable();
|
||||
};
|
||||
/* #################### 顶部事件 #################### */
|
||||
const handleChangeSearch = (e) => {
|
||||
if (tableData.value.keyword == "") {
|
||||
getTable();
|
||||
}
|
||||
};
|
||||
const modalInfo = ref({
|
||||
title:'新增个人数据',
|
||||
id:0,
|
||||
form:{
|
||||
name:null,
|
||||
num:'',
|
||||
percent:'',
|
||||
amount:'',
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
const submitForm = ()=>{
|
||||
let url = '',params = {};
|
||||
|
||||
console.log(userList.value);
|
||||
console.log(modalInfo.value.form.userId);
|
||||
// let obj = userList.value.find(item => item.id === modalInfo.value.form.userId)
|
||||
|
||||
// console.log(obj);
|
||||
|
||||
params = {
|
||||
name:modalInfo.value.form.name,
|
||||
num:modalInfo.value.form.num,
|
||||
percent:modalInfo.value.form.percent,
|
||||
amount:modalInfo.value.form.amount,
|
||||
userId:modalInfo.value.form.userId,
|
||||
id:modalInfo.value.id
|
||||
}
|
||||
|
||||
if(modalInfo.value.id){
|
||||
delete params.password;
|
||||
updateUserStockApi(params).then((res)=>{
|
||||
showAdd.value = false;
|
||||
message.success("修改成功");
|
||||
getTable();
|
||||
});
|
||||
}else{
|
||||
addStockUserApi(params).then((res)=>{
|
||||
showAdd.value = false;
|
||||
message.success("新增成功");
|
||||
getTable();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
const handleToForm = ($type, $data) => {
|
||||
showAdd.value = true;
|
||||
console.log($data.id);
|
||||
modalInfo.value = {
|
||||
isShow:true,
|
||||
title:'修改个人数据',
|
||||
form:{
|
||||
name:$data.name,
|
||||
num:$data.num,
|
||||
percent:$data.percent,
|
||||
amount:$data.amount,
|
||||
userId:$data.userId
|
||||
},
|
||||
id:$data.id
|
||||
}
|
||||
|
||||
// updateUserApi({
|
||||
// description: "测试备注",
|
||||
// idcard: "123123123123123123",
|
||||
// name: "测试真名",
|
||||
// username: "13214534564",
|
||||
// password: 123456,
|
||||
// status: 0,
|
||||
// username: "测试用户名",
|
||||
// }).then(() => {
|
||||
// message.success("新增成功");
|
||||
// getTable();
|
||||
// });
|
||||
// if ($data.id > 0) {
|
||||
// router.push({
|
||||
// path: "/merchantManagement/jobForm",
|
||||
// query: {
|
||||
// id: $data.id ? $data.id : 0,
|
||||
// type: $type,
|
||||
// templateId: $data.templateId ? $data.templateId : 0,
|
||||
// },
|
||||
// });
|
||||
// } else {
|
||||
// router.push({
|
||||
// path: "/merchantManagement/jobForm",
|
||||
// query: {
|
||||
// id: $data.id ? $data.id : 0,
|
||||
// type: $type,
|
||||
// },
|
||||
// });
|
||||
// }
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* #################### 表格事件 #################### */
|
||||
const tableData = ref({
|
||||
keyword: "",
|
||||
page: 1,
|
||||
limit: 20,
|
||||
total: 0,
|
||||
count: 0,
|
||||
loading: false,
|
||||
records: [],
|
||||
jobType2Num: "-",
|
||||
jobType1Num: "-",
|
||||
});
|
||||
const getTable = () => {
|
||||
console.log(tableData.value);
|
||||
tableData.value.loading = true;
|
||||
getStockUserListApi({ limit: tableData.value.limit, page: tableData.value.page, keyword: tableData.value.keyword }).then((res) => {
|
||||
console.log(res);
|
||||
tableData.value = { ...res.data, keyword: tableData.value.keyword, page: res.data.current, limit: res.data.size };
|
||||
tableData.value.records.forEach((item, index) => {
|
||||
item.rank = index + 1;
|
||||
});
|
||||
});
|
||||
};
|
||||
const openAdd = () =>{
|
||||
showAdd.value = true
|
||||
modalInfo.value.id = 0;
|
||||
modalInfo.value = {
|
||||
title:"新增个人数据",
|
||||
form:{
|
||||
name:null,
|
||||
username:'',
|
||||
idcard:'',
|
||||
description:''
|
||||
}
|
||||
}
|
||||
|
||||
getUserListApi({ limit:100, page: 1, keyword:""}).then((res)=>{
|
||||
userList.value = res.data.records
|
||||
// modalInfo.value.name = res.data.records[0].name
|
||||
console.log(res);
|
||||
});
|
||||
};
|
||||
const columns = ref([
|
||||
{
|
||||
title: "序号",
|
||||
key: "rank",
|
||||
dataIndex: "rank",
|
||||
width: "50px",
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: "姓名",
|
||||
key: "name",
|
||||
dataIndex: "name",
|
||||
},
|
||||
|
||||
{
|
||||
title: "持股数",
|
||||
key: "num",
|
||||
dataIndex: "num",
|
||||
ellipsis: true,
|
||||
width: "240px",
|
||||
},
|
||||
{
|
||||
title: "持股比例",
|
||||
key: "percent",
|
||||
dataIndex: "percent",
|
||||
width: "240px",
|
||||
ellipsis: true,
|
||||
customRender: (record) => {
|
||||
return record.record.percent ? record.record.percent : '-';
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
title: "持股价值(元)",
|
||||
key: "amount",
|
||||
dataIndex: "amount",
|
||||
ellipsis: true,
|
||||
width: "240px",
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
key: "state",
|
||||
dataIndex: "state",
|
||||
width: "90px",
|
||||
ellipsis: true,
|
||||
},
|
||||
]);
|
||||
/**
|
||||
* 切换用户状态
|
||||
*/
|
||||
const handleStatus = (e, $data) => {
|
||||
updateUserStatusApi({ id: $data.id, status: e ? 1 : 0 }).then(() => {
|
||||
message.success("更新成功");
|
||||
getTable();
|
||||
});
|
||||
};
|
||||
const addInfo = ref({});
|
||||
|
||||
const goDetail = ($item) => {
|
||||
console.log($item);
|
||||
// 前往详情页
|
||||
if ($item.jobType == 1) {
|
||||
// 共享
|
||||
router.push({
|
||||
path: "/merchantManagement/shareJobDetail",
|
||||
query: {
|
||||
id: $item.templateId,
|
||||
shared: $item.shared,
|
||||
form: "joblist",
|
||||
},
|
||||
});
|
||||
} else {
|
||||
// 自有
|
||||
router.push({
|
||||
path: "/merchantManagement/jobDetail",
|
||||
query: {
|
||||
id: $item.id,
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
const handleApplication = (record) => {
|
||||
console.log(record);
|
||||
if (!record.statusBool) {
|
||||
return false;
|
||||
}
|
||||
// 报名事件
|
||||
router.push({
|
||||
path: "/merchantManagement/recordJob",
|
||||
query: {
|
||||
company: record.boss,
|
||||
job: record.job,
|
||||
jobId: record.id,
|
||||
templateId: record.templateId,
|
||||
jobType: record.jobType,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
const handleDel = ($data) => {
|
||||
commonJS.gConfirmModal(
|
||||
"删除",
|
||||
"确认删除该用户吗?",
|
||||
() => {
|
||||
delUserApi($data.id).then(() => {
|
||||
message.success("删除成功");
|
||||
getTable();
|
||||
});
|
||||
},
|
||||
() => {}
|
||||
);
|
||||
};
|
||||
|
||||
/* #################### 分页器事件 #################### */
|
||||
const handleModalPage = ($page, $size) => {
|
||||
// 监听明细页码
|
||||
console.log($page);
|
||||
console.log($size);
|
||||
tableData.value.page = $page;
|
||||
getTable();
|
||||
};
|
||||
const handleModalSize = ($page, $size) => {
|
||||
// 监听明细size
|
||||
tableData.value.page = 1;
|
||||
tableData.value.size = $size;
|
||||
getTable();
|
||||
};
|
||||
/* #################### 分页器事件 #################### */
|
||||
const handleModalDetailPage = ($page, $size) => {
|
||||
// 监听明细页码
|
||||
console.log($page);
|
||||
console.log($size);
|
||||
tableDetail.value.page = $page;
|
||||
getUserMoreList();
|
||||
};
|
||||
const handleModalDetailSize = ($page, $size) => {
|
||||
// 监听明细size
|
||||
tableDetail.value.page = 1;
|
||||
tableDetail.value.size = $size;
|
||||
getUserMoreList();
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取持股列表
|
||||
*/
|
||||
const getUserMoreList = () => {
|
||||
getUserMoreListApi({ limit: tableDetail.value.limit, page: tableDetail.value.page, userId: userId.value }).then((res) => {
|
||||
console.log(res);
|
||||
|
||||
// tableDetail.value = { ...res.data, keyword: tableData.value.keyword, page: res.data.current, limit: res.data.size };
|
||||
tableDetail.value.list = res.data.records
|
||||
tableDetail.value.count = res.data.total
|
||||
tableDetail.value.list.forEach((item, index) => {
|
||||
item.rank = index + 1;
|
||||
});
|
||||
// stockMoreList.value = res.data;
|
||||
// stockMoreList.value.forEach((item, index) => {
|
||||
// item.rank = index + 1;
|
||||
// });
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 上传持股文件
|
||||
*/
|
||||
const getMoreInfo = (info) => {
|
||||
console.log(info);
|
||||
if (info.file.response) {
|
||||
if (info.file.response.code == 200) {
|
||||
getUserMoreList();
|
||||
message.success("操作成功");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
|
||||
.ant-table-cell:empty::before{
|
||||
content: "-";
|
||||
}
|
||||
.p-manage-myJob {
|
||||
position: relative;
|
||||
min-height: calc(100vh - 213px);
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
.btn-active {
|
||||
width: 40px;
|
||||
height: 24px;
|
||||
margin-left: 6.5px;
|
||||
font-size: 12px;
|
||||
color: #f6343e;
|
||||
background-color: #fff3f3;
|
||||
padding: 1px 3px;
|
||||
zoom: 0.6;
|
||||
margin-top: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.ant-spin-blur .ant-empty {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
@ -1,157 +0,0 @@
|
||||
<template>
|
||||
<!--我的职位-->
|
||||
<div class="p-manage-myJob">
|
||||
<div class="m-select g_flex_row_between">
|
||||
<!-- <div class="g_flex_row_start">
|
||||
<div class="g_w_320 g-search-btn g_mr_16">
|
||||
<a-input-search v-model:value="tableData.keyword" placeholder="请输入姓名" @search="searchList" @change="handleChangeSearch" allowClear />
|
||||
</div>
|
||||
</div> -->
|
||||
<div>
|
||||
|
||||
<!-- <a-button type="primary" @click="openAdd" :icon="h(PlusOutlined)">新增用户</a-button> -->
|
||||
<!-- <a-button type="" class="g_border_d g_ml_16" @click="handleToForm('add', { id: 0 })" :icon="h(DownloadOutlined)">导出模版</a-button> -->
|
||||
<!--
|
||||
<a-dropdown :trigger="['click']">
|
||||
<template #overlay>
|
||||
<a-menu>
|
||||
<a-menu-item key="1" @click="goShareList">共享职位</a-menu-item>
|
||||
<a-menu-item key="2" @click="handleToForm('add',{id:0})">自有职位</a-menu-item>
|
||||
</a-menu>
|
||||
</template>
|
||||
<a-button>
|
||||
新增职位
|
||||
<DownOutlined style="zoom:.8" />
|
||||
</a-button>
|
||||
</a-dropdown> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-table g_mt_20 antd-table">
|
||||
<a-table sticky :columns="columns" :scroll="{x:1000}" :data-source="tableData.records" size="middle" :pagination="false" :loading="tableData.loading" class="g_clear_scroll" style="max-width: calc(100% - 0px)">
|
||||
<template #bodyCell="{ column, record }">
|
||||
</template>
|
||||
</a-table>
|
||||
<div class="g_pb_16 g_pt_16 g_pageBottom" v-if="tableData.records.length > 0">
|
||||
<a-pagination v-model:current="tableData.page" v-model:page-size="tableData.size" :total="tableData.total" :pageSize="tableData.size" :show-total="(total) => `共 ${total} 条`" @change="handleModalPage" @showSizeChange="handleModalSize" :show-quick-jumper="tableData.total < tableData.size ? false : true" :showSizeChanger="tableData.total < tableData.size ? false : true" :hideOnSinglePage="false" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import request from "../../utils/request"; // 引入基础路径
|
||||
import { ref, onMounted, getCurrentInstance, h, watch } from "vue";
|
||||
import { PlusOutlined, EllipsisOutlined, UploadOutlined, DownOutlined } from "@ant-design/icons-vue";
|
||||
import { Modal, message } from "ant-design-vue";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import {getLoginLogApi} from "../../api/login";
|
||||
import { DownloadOutlined } from "@ant-design/icons-vue";
|
||||
import idCardPanel from "../components/upload/image.vue";
|
||||
|
||||
/* #################### 初始化事件 #################### */
|
||||
const router = useRouter(); // 应用路由
|
||||
const route = useRoute();
|
||||
const commonJS = getCurrentInstance().appContext.app.config.globalProperties.G;
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
getTable();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
/* #################### 表格事件 #################### */
|
||||
const tableData = ref({
|
||||
keyword: "",
|
||||
page: 1,
|
||||
limit: 20,
|
||||
total: 0,
|
||||
count: 0,
|
||||
loading: false,
|
||||
records: [],
|
||||
});
|
||||
const getTable = () => {
|
||||
console.log(tableData.value);
|
||||
tableData.value.loading = true;
|
||||
getLoginLogApi({ limit: tableData.value.limit, page: tableData.value.page}).then((res) => {
|
||||
console.log(res);
|
||||
tableData.value = { ...res.data, page: res.data.current, limit: res.data.size };
|
||||
tableData.value.records.forEach((item, index) => {
|
||||
item.rank = index + 1;
|
||||
});
|
||||
});
|
||||
};
|
||||
const columns = ref([
|
||||
{
|
||||
title: "序号",
|
||||
key: "rank",
|
||||
dataIndex: "rank",
|
||||
width: "50px",
|
||||
ellipsis: true,
|
||||
},
|
||||
{
|
||||
title: "姓名",
|
||||
key: "username",
|
||||
width:"120px",
|
||||
dataIndex: "username",
|
||||
},
|
||||
{
|
||||
title: "电话",
|
||||
key: "name",
|
||||
width:"180px",
|
||||
dataIndex: "name",
|
||||
},
|
||||
{
|
||||
title: "登录时间",
|
||||
key: "updateTime",
|
||||
dataIndex: "updateTime",
|
||||
ellipsis: true,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
/* #################### 分页器事件 #################### */
|
||||
const handleModalPage = ($page, $size) => {
|
||||
// 监听明细页码
|
||||
console.log($page);
|
||||
console.log($size);
|
||||
tableData.value.page = $page;
|
||||
getTable();
|
||||
};
|
||||
const handleModalSize = ($page, $size) => {
|
||||
// 监听明细size
|
||||
tableData.value.page = 1;
|
||||
tableData.value.size = $size;
|
||||
getTable();
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
|
||||
.ant-table-cell:empty::before{
|
||||
content: "-";
|
||||
}
|
||||
.p-manage-myJob {
|
||||
position: relative;
|
||||
min-height: calc(100vh - 213px);
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
.btn-active {
|
||||
width: 40px;
|
||||
height: 24px;
|
||||
margin-left: 6.5px;
|
||||
font-size: 12px;
|
||||
color: #f6343e;
|
||||
background-color: #fff3f3;
|
||||
padding: 1px 3px;
|
||||
zoom: 0.6;
|
||||
margin-top: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.ant-spin-blur .ant-empty {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,262 @@
|
||||
<template>
|
||||
<div class="content-management">
|
||||
<a-tabs v-model:activeKey="activeTab" @change="tabChange">
|
||||
<a-tab-pane key="recommendations" tab="今日推荐"></a-tab-pane>
|
||||
<a-tab-pane key="stores" tab="门店"></a-tab-pane>
|
||||
<a-tab-pane key="events" tab="赛事分析"></a-tab-pane>
|
||||
<template #rightExtra>
|
||||
<a-button type="primary" @click="showAddModal">新增</a-button>
|
||||
</template>
|
||||
</a-tabs>
|
||||
|
||||
<a-table :columns="columns" :data-source="filteredData" :rowKey="record => record.id">
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.key === 'content'">
|
||||
<div v-if="record.classify === 1">
|
||||
<a-image
|
||||
:src="record.img"
|
||||
:width="50"
|
||||
:height="50"
|
||||
style="margin-right: 5px;"
|
||||
/>
|
||||
</div>
|
||||
<span v-else v-html="record.content"></span>
|
||||
</template>
|
||||
<template v-if="column.key === 'status'">
|
||||
<a-tag :color="record.status === 1 ? 'green' : 'orange'">
|
||||
{{ record.status === 1 ? '已发布' : '未发布' }}
|
||||
</a-tag>
|
||||
</template>
|
||||
<template v-if="column.key === 'action'">
|
||||
<a-space>
|
||||
<a-button type="link" @click="editItem(record)">编辑</a-button>
|
||||
<a-button type="link" @click="deleteItem(record)">删除</a-button>
|
||||
</a-space>
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
|
||||
<a-modal
|
||||
v-model:visible="modalVisible"
|
||||
:title="modalMode === 'add' ? '新增内容' : '编辑内容'"
|
||||
@ok="handleModalOk"
|
||||
@cancel="handleModalCancel"
|
||||
width="800px"
|
||||
>
|
||||
<a-form :model="formState" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
|
||||
<a-form-item label="类型">
|
||||
<a-select v-model:value="formState.classify" :disabled="modalMode === 'edit'">
|
||||
<a-select-option :value="1">今日推荐</a-select-option>
|
||||
<a-select-option :value="0">门店</a-select-option>
|
||||
<a-select-option :value="2">赛事分析</a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
<a-form-item label="标题">
|
||||
<a-input v-model:value="formState.title" placeholder="输入标题"/>
|
||||
</a-form-item>
|
||||
<a-form-item label="主图">
|
||||
<a-upload
|
||||
v-model:fileList="formState.images"
|
||||
list-type="picture-card"
|
||||
:max-count="1"
|
||||
@preview="handlePreview"
|
||||
@change="handleImageChange"
|
||||
:customRequest="customRequest"
|
||||
>
|
||||
<div v-if="formState.images.length < 1">
|
||||
<plus-outlined />
|
||||
<div style="margin-top: 8px">上传图片</div>
|
||||
</div>
|
||||
</a-upload>
|
||||
</a-form-item>
|
||||
<a-form-item label="内容" v-if="formState.classify !== 1">
|
||||
<wysiwyg-editor v-model="formState.content" @image-upload="handleEditorImageUpload" />
|
||||
</a-form-item>
|
||||
<a-form-item label="状态">
|
||||
<a-switch v-model:checked="formState.status" :checked-value="1" :unchecked-value="0" />
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</a-modal>
|
||||
|
||||
<a-modal v-model:visible="previewVisible" :title="previewTitle" :footer="null">
|
||||
<img alt="example" style="width: 100%" :src="previewImage" />
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, computed, onMounted } from 'vue';
|
||||
import { message } from 'ant-design-vue';
|
||||
import { PlusOutlined } from '@ant-design/icons-vue';
|
||||
import WysiwygEditor from './WysiwygEditor.vue';
|
||||
import { saveContentApi, updateContentApi, getContentListApi, deleteContentApi, uploadImageApi } from "../../api/contentConfig";
|
||||
|
||||
const activeTab = ref('recommendations');
|
||||
const modalVisible = ref(false);
|
||||
const modalMode = ref('add');
|
||||
const previewVisible = ref(false);
|
||||
const previewImage = ref('');
|
||||
const previewTitle = ref('');
|
||||
|
||||
const columns = [
|
||||
{ title: '类型', dataIndex: 'classify', key: 'classify' },
|
||||
{ title: '标题', dataIndex: 'title', key: 'title' },
|
||||
{ title: '内容', dataIndex: 'content', key: 'content' },
|
||||
{ title: '状态', dataIndex: 'status', key: 'status' },
|
||||
{ title: '操作', key: 'action' },
|
||||
];
|
||||
|
||||
const data = reactive([]);
|
||||
const classify = ref(0);
|
||||
|
||||
const formState = reactive({
|
||||
id: null,
|
||||
classify: 1,
|
||||
title: '',
|
||||
content: '',
|
||||
img: '',
|
||||
images: [],
|
||||
status: 0,
|
||||
});
|
||||
|
||||
const filteredData = computed(() => {
|
||||
const tabToClassify = {
|
||||
'recommendations': 1,
|
||||
'stores': 0,
|
||||
'events': 2
|
||||
};
|
||||
return data.filter(item => item.classify === tabToClassify[activeTab.value]);
|
||||
});
|
||||
|
||||
const showAddModal = () => {
|
||||
modalMode.value = 'add';
|
||||
const tabToClassify = {
|
||||
'recommendations': 1,
|
||||
'stores': 0,
|
||||
'events': 2
|
||||
};
|
||||
Object.assign(formState, { id: null, classify: tabToClassify[activeTab.value], title: '', content: '', img: '', images: [], status: 0 });
|
||||
modalVisible.value = true;
|
||||
};
|
||||
|
||||
const editItem = (record) => {
|
||||
modalMode.value = 'edit';
|
||||
Object.assign(formState, {
|
||||
...record,
|
||||
images: record.img ? [{
|
||||
uid: -1,
|
||||
name: 'image.jpg',
|
||||
status: 'done',
|
||||
url: record.img,
|
||||
}] : []
|
||||
});
|
||||
modalVisible.value = true;
|
||||
};
|
||||
|
||||
const deleteItem = async (record) => {
|
||||
try {
|
||||
await deleteContentApi(record.id);
|
||||
message.success('删除成功');
|
||||
fetchData();
|
||||
} catch (error) {
|
||||
message.error('删除失败');
|
||||
}
|
||||
};
|
||||
|
||||
const handleModalOk = async () => {
|
||||
try {
|
||||
const data = {
|
||||
classify: formState.classify,
|
||||
title: formState.title,
|
||||
content: formState.classify === 1 ? '' : formState.content,
|
||||
img: formState.img,
|
||||
status: formState.status,
|
||||
};
|
||||
if (modalMode.value === 'add') {
|
||||
await saveContentApi(data);
|
||||
} else {
|
||||
await updateContentApi({ ...data, id: formState.id });
|
||||
}
|
||||
message.success(modalMode.value === 'add' ? '添加成功' : '编辑成功');
|
||||
modalVisible.value = false;
|
||||
fetchData();
|
||||
} catch (error) {
|
||||
message.error(modalMode.value === 'add' ? '添加失败' : '编辑失败');
|
||||
}
|
||||
};
|
||||
|
||||
const handleModalCancel = () => {
|
||||
modalVisible.value = false;
|
||||
};
|
||||
|
||||
const tabChange = (activeKey) => {
|
||||
classify.value = activeKey === 'recommendations' ? 1 : activeKey === 'stores' ? 0 : 2;
|
||||
fetchData();
|
||||
};
|
||||
|
||||
const handlePreview = async (file) => {
|
||||
if (!file.url && !file.preview) {
|
||||
file.preview = await getBase64(file.originFileObj);
|
||||
}
|
||||
previewImage.value = file.url || file.preview;
|
||||
previewVisible.value = true;
|
||||
previewTitle.value = file.name || file.url.substring(file.url.lastIndexOf('/') + 1);
|
||||
};
|
||||
|
||||
const customRequest = async ({ file, onSuccess, onError }) => {
|
||||
try {
|
||||
const response = await uploadImageApi(file);
|
||||
formState.img = response.data;
|
||||
onSuccess(response, file);
|
||||
} catch (error) {
|
||||
onError(error);
|
||||
}
|
||||
};
|
||||
|
||||
const handleImageChange = ({ fileList }) => {
|
||||
formState.images = fileList;
|
||||
};
|
||||
|
||||
const handleEditorImageUpload = async (file) => {
|
||||
try {
|
||||
const response = await uploadImageApi(file);
|
||||
return response.data; // Return the image URL
|
||||
} catch (error) {
|
||||
message.error('图片上传失败');
|
||||
return '';
|
||||
}
|
||||
};
|
||||
|
||||
const getBase64 = (file) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
reader.readAsDataURL(file);
|
||||
reader.onload = () => resolve(reader.result);
|
||||
reader.onerror = error => reject(error);
|
||||
});
|
||||
};
|
||||
|
||||
const fetchData = async () => {
|
||||
try {
|
||||
const response = await getContentListApi(1, 10, classify.value);
|
||||
data.splice(0, data.length, ...response.data.records);
|
||||
} catch (error) {
|
||||
message.error('获取数据失败');
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
fetchData();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.content-management {
|
||||
padding: 24px;
|
||||
}
|
||||
.table-actions {
|
||||
margin-bottom: 16px;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
Loading…
Reference in New Issue