Browse Source

前缀

lihuilin/feature-20250718094329-25周年庆后台
lihuilin 4 weeks ago
parent
commit
49750b6a6f
  1. 6
      activitylink/.env.development
  2. 6
      activitylink/.env.production
  3. 1
      activitylink/package-lock.json
  4. 1
      activitylink/package.json
  5. 34
      activitylink/src/api/manage/activity.js
  6. 2
      activitylink/src/api/manage/gift.js
  7. BIN
      activitylink/src/img/1.jpg
  8. BIN
      activitylink/src/img/2.png
  9. BIN
      activitylink/src/img/3.png
  10. 5
      activitylink/src/router/index.js
  11. 7
      activitylink/src/utils/request.js
  12. 36
      activitylink/src/views/homePage.vue
  13. 6
      activitylink/src/views/zhongchou/activity/detail/index.vue
  14. 2
      activitylink/src/views/zhongchou/activity/index.vue
  15. 76
      activitylink/src/views/zhongchou/activity/set/index.vue
  16. 9
      activitylink/src/views/zhongchou/gift/index.vue
  17. 33
      activitylink/src/views/zhongchou/index.vue
  18. 19
      activitylink/src/views/zhongchou/mainImg/DefaultImage.vue
  19. 189
      activitylink/src/views/zhongchou/user/index.vue
  20. 10
      activitylink/src/views/zhongchou/winning/index.vue
  21. 19
      activitylink/vite.config.js

6
activitylink/.env.development

@ -1,7 +1,7 @@
VITE_ENV = 'development'
VITE_OUTPUT_DIR = 'dev'
VITE_PUBLIC_PATH = '/testBack/'
VITE_APP_BASE_API = 'https://dbqb.nfdxy.net/devLotApi/'
# VITE_APP_BASE_API = 'http://localhost:12699/'
VITE_USE_MOCK = true
VITE_UPLOAD_URL='/hljw/api/aws/upload'
VITE_APP_BASE_API = 'https://dbqb.nfdxy.net/devLotApi'
VITE_UPLOAD_URL='http://39.101.133.168:8828/hljw/api/aws/upload'
# VITE_APP_BASE_API = 'http://localhost:12699/'

6
activitylink/.env.production

@ -2,7 +2,9 @@ VITE_ENV = 'production'
VITE_OUTPUT_DIR = 'dist'
VITE_PUBLIC_PATH = '/testBack/'
VITE_USE_MOCK = true
VITE_BUILD_COMPRESS = 'none'
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
VITE_UPLOAD_URL='https://api.homilychart.com/hljw/api/aws/upload'
VITE_APP_BASE_API = 'https://dbqb.nfdxy.net/devLotApi'
VITE_BUILD_COMPRESS = 'none'
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false

1
activitylink/package-lock.json

@ -8,6 +8,7 @@
"name": "activitylink",
"version": "0.0.0",
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"@vitejs/plugin-vue": "^4.6.2",
"axios": "^1.10.0",
"element-plus": "^2.10.4",

1
activitylink/package.json

@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"@vitejs/plugin-vue": "^4.6.2",
"axios": "^1.10.0",
"element-plus": "^2.10.4",

34
activitylink/src/api/manage/activity.js

@ -49,28 +49,29 @@ export function getDetailListbyActivityId(data) {
}
export function getDetailMessage(activityId){
export function getDetailMessage(data){
return request({
url: '/admin/funding/getActivityDate',
method: 'post',
params: { activityId }
data
})
}
export function showsetDetail(activityId){
export function showsetDetail(data){
return request({
url: '/admin/funding/getDate',
method: 'post',
params: { activityId }
data
})
}
// export function showaddDetail(activityId,stock,addTotal){
// 更新后用的
// export function showsetDetail(data){
// return request({
// url: '/admin/funding/addDateVirtual',
// url: '/admin/funding/getDate',
// method: 'post',
// params: { activityId,stock,addTotal }
// data
// })
// }
@ -82,28 +83,37 @@ export function showaddDetail(data){
})
}
export function setTime(activityId,time){
export function setTime(data){
return request({
url: '/admin/funding/setActivityTime',
method: 'post',
params: { activityId,time }
data
})
}
export function getMarket(){
return request({
url: '/admin/funding/getMarketList',
method: 'get',
method: 'get'
})
}
export function getMarketById(data){
return request({
url: '/admin/funding/getMarketList',
method: 'post',
data
})
}
export function deleteActivityById(activityId)
export function deleteActivityById(data)
{
return request({
url: '/admin/funding/deleteActivity',
method: 'post',
params: { activityId }
data
})
}

2
activitylink/src/api/manage/gift.js

@ -158,4 +158,4 @@ export const importFixUsers = (file,gradeId) => {
'Content-Type': 'multipart/form-data'
}
});
};
};

BIN
activitylink/src/img/1.jpg

Before

Width: 5244  |  Height: 2950  |  Size: 2.1 MiB

BIN
activitylink/src/img/2.png

After

Width: 1920  |  Height: 1080  |  Size: 204 KiB

BIN
activitylink/src/img/3.png

After

Width: 1020  |  Height: 704  |  Size: 5.9 KiB

5
activitylink/src/router/index.js

@ -28,6 +28,11 @@ const routes = [
component: () => import('../views/zhongchou/gift/index.vue'),
},
{
path: 'userManagement', // 注意这里不要加斜杠,表示相对路径
name: 'zhongchouuser',
component: () => import('../views/zhongchou/user/index.vue'),
},
{
path: 'giftManagement/importUsers', // 注意这里不要加斜杠,表示相对路径
name: 'importUsers',
component: () => import('../views/zhongchou/gift/importuser/index.vue'),

7
activitylink/src/utils/request.js

@ -26,11 +26,4 @@ service.interceptors.response.use(
return Promise.reject(error)
}
)
export const uploadFile = (file) => {
const formData = new FormData();
formData.append('file', file);
return service.post('/api/upload/hljw/api/aws/upload', formData, {
headers: {'Content-Type': 'multipart/form-data'}
});
};
export default service

36
activitylink/src/views/homePage.vue

@ -1,6 +1,7 @@
<template>
<div class="login-container">
<div class="login-box">
<div class="login-container1">
<div class="login-container2">
<div class="login-box">
<h2>登录</h2>
<form @submit.prevent="login">
<div class="input-group">
@ -14,6 +15,8 @@
<button type="submit" @click="loginHandler">登录</button>
</form>
</div>
</div>
</div>
</template>
<script setup>
@ -31,11 +34,10 @@ const loginHandler = async () => {
username: username.value,
password: password.value
})
if (response.code===200 ) {
const token = response.code
// token localStorage
// router.push('/zhongchou/mainimg')
if (response.code === 200 ) {
const token = response.data.token
// console.log(token)
localStorage.setItem('token', token)
ElMessage.success('登录成功,欢迎您使用本系统')
router.push('/zhongchou/mainimg')
@ -49,13 +51,13 @@ const loginHandler = async () => {
}
</script>
<style scoped>
.login-container {
.login-container1 {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('@/img/1.jpg') no-repeat center center fixed;
background-image: url('@/img/2.png') ;
background-size: cover;
background-position: center;
z-index: 0;
@ -66,6 +68,22 @@ const loginHandler = async () => {
align-items: center;
}
.login-container2 {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('@/img/3.png');
background-size: cover;
z-index: 0;
display: flex;
justify-content: center;
align-items: center;
}
.login-box {
background-color: rgba(255, 255, 255, 0.9);
padding: 2rem;

6
activitylink/src/views/zhongchou/activity/detail/index.vue

@ -72,7 +72,7 @@
import { ref, onMounted } from 'vue'
import { useRouter , onBeforeRouteLeave} from 'vue-router'
import { useactivityStone } from '@/stone/activityStone'
import { getDetailListbyActivityId, getDetailMessage, getMarket, exportActivityDataExcel } from '@/api/manage/activity'
import { getDetailListbyActivityId, getDetailMessage, getMarketById, exportActivityDataExcel } from '@/api/manage/activity'
import { ElMessage } from 'element-plus'
const activityStone = useactivityStone()
@ -91,7 +91,7 @@ const marketList = ref([])
//
const fetchMarketList = async () => {
try {
const response = await getMarket()
const response = await getMarketById({ activityId: activityStone.selectactivityId })
if (response.code === 200) {
marketList.value = response.data
} else {
@ -277,7 +277,7 @@ const fetchDetailMessage = async () => {
return
}
const response = await getDetailMessage(activityId)
const response = await getDetailMessage({activityId : activityId})
if (response.code === 200) {
const data = response.data

2
activitylink/src/views/zhongchou/activity/index.vue

@ -285,7 +285,7 @@ const confirmDelete = async () => {
}
try {
const response = await deleteActivityById(activityToDelete.value)
const response = await deleteActivityById({activityId: activityToDelete.value})
if (response.code === 200) {
ElMessage.success('活动删除成功')

76
activitylink/src/views/zhongchou/activity/set/index.vue

@ -103,31 +103,69 @@ const marketOneName = ref('');
const marketTwoName = ref('');
//
// const fetchData = async () => {
// try {
// const response = await showsetDetail(activityStone.selectactivityId);
// const data = response.data;
// console.log(data);
// //
// marketOne.value = data.marketOne;
// marketTwo.value = data.marketTwo;
// markerOneTotal.value = data.markerOneTotal;
// markerTwoTotal.value = data.markerTwoTotal;
// showOne.value = data.showOne;
// showTwo.value = data.showTwo;
// initialData.value = data.time;
// marketOneId.value = data.marketOneId;
// marketTwoId.value = data.marketTwoId;
// //
// marketOneName.value = data.marketOne;
// marketTwoName.value = data.marketTwo;
// } catch (error) {
// console.error(':', error);
// //
// }
// };
const fetchData = async () => {
try {
const response = await showsetDetail(activityStone.selectactivityId);
//
const response = await showsetDetail({ activityId: activityStone.selectactivityId });
const data = response.data;
console.log(data);
//
marketOne.value = data.marketOne;
marketTwo.value = data.marketTwo;
markerOneTotal.value = data.markerOneTotal;
markerTwoTotal.value = data.markerTwoTotal;
showOne.value = data.showOne;
showTwo.value = data.showTwo;
//
const marketList = data.data;
//
if (marketList && marketList.length >= 2) {
const marketOneData = marketList[0];
const marketTwoData = marketList[1];
//
marketOne.value = marketOneData.market;
showOne.value = marketOneData.show;
markerOneTotal.value = marketOneData.markerTotal;
marketOneId.value = marketOneData.marketId;
//
marketTwo.value = marketTwoData.market;
showTwo.value = marketTwoData.show;
markerTwoTotal.value = marketTwoData.markerTotal;
marketTwoId.value = marketTwoData.marketId;
}
//
initialData.value = data.time;
marketOneId.value = data.marketOneId;
marketTwoId.value = data.marketTwoId;
//
marketOneName.value = data.marketOne;
marketTwoName.value = data.marketTwo;
marketOneName.value = marketList[0]?.market || '';
marketTwoName.value = marketList[1]?.market || '';
} catch (error) {
console.error('获取数据失败:', error);
//
ElMessage.error('获取数据失败,请重试');
}
};
//
onMounted(() => {
fetchData();
@ -172,8 +210,10 @@ const confirmInitialData = async () => {
}
const response = await setTime(
id,
time
{
activityId: id,
time: time
}
)
if (response.code === 200) {

9
activitylink/src/views/zhongchou/gift/index.vue

@ -48,9 +48,10 @@
</el-select>
</el-form-item>
<el-form-item label="礼品图片" :rules="{ required: true, message: '请上传图片', trigger: 'change' }">
<el-upload ref="uploadRef" :action="uploadUrl" list-type="picture-card" :auto-upload="false" :http-request="customUpload"
<el-upload ref="uploadRef" list-type="picture-card" :auto-upload="false" :http-request="customUpload"
:on-change="handleImageChange" :on-success="handleUploadSuccess" :on-error="handleUploadError"
:before-upload="beforeUpload" :show-file-list="false">
<!-- :action="uploadUrl" -->
<el-icon>
<Plus />
</el-icon>
@ -85,9 +86,10 @@
</el-select>
</el-form-item>
<el-form-item label="礼品图片" :rules="{ required: true, message: '请上传图片', trigger: 'change' }">
<el-upload ref="uploadRef" :action="uploadUrl" list-type="picture-card" :auto-upload="false"
<el-upload ref="uploadRef" list-type="picture-card" :auto-upload="false"
:on-change="handleImageChange" :on-success="handleUploadSuccess" :on-error="handleUploadError"
:before-upload="beforeUpload" :show-file-list="false">
<!-- :action="uploadUrl" -->
<el-icon>
<Plus />
</el-icon>
@ -143,7 +145,8 @@ const editForm = ref({
gradeId: '',
imageUrl: null
})
const uploadUrl = ref('/upload')
// const uploadUrl = 'https://api.homilychart.com/hljw/api/aws/upload'; //
const uploadUrl = import.meta.env.VITE_UPLOAD_URL
const formRef = ref(null)
const uploadRef = ref(null)

33
activitylink/src/views/zhongchou/index.vue

@ -5,8 +5,11 @@ import {
Location,
Menu as IconMenu,
Document,
Setting
Setting,
User,
HelpFilled
} from '@element-plus/icons-vue'
import { ElMessageBox, ElMessage } from 'element-plus';
import { useRouter } from 'vue-router'
const router = useRouter()
const handleOpen = (key, keyPath) => {
@ -16,7 +19,19 @@ const handleClose = (key, keyPath) => {
// console.log(':', key, keyPath)
}
const handleLogout = () => {
ElMessageBox.confirm('确定要退出登录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//
router.push('/homePage');
}).catch(() => {
//
ElMessage.info('已取消退出');
});
};
</script>
<template>
@ -56,8 +71,18 @@ const handleClose = (key, keyPath) => {
</el-menu-item>
<el-menu-item index="/zhongchou/activityManagement">
<el-icon><setting /></el-icon>
<span>众筹活动</span>
<el-icon><HelpFilled /></el-icon>
<span>活动管理</span>
</el-menu-item>
<el-menu-item index="/zhongchou/userManagement">
<el-icon><User /></el-icon>
<span>用户管理</span>
</el-menu-item>
<el-menu-item @click="handleLogout">
<el-icon><Setting /></el-icon>
<span>退出登录</span>
</el-menu-item>
</el-menu>
</el-aside>

19
activitylink/src/views/zhongchou/mainImg/DefaultImage.vue

@ -1,6 +1,8 @@
<template>
<div class="default-image-container">
<div class="default-image"></div>
<div class="default-image">
<div class="default-image2"></div>
</div>
</div>
</template>
@ -27,9 +29,22 @@
left: 0;
width: 100%;
height: 100%;
background: url('@/img/1.jpg') no-repeat center center fixed;
background: url('@/img/2.png') no-repeat center center fixed;
background-size: cover;
background-position: center;
z-index: -1;
}
.default-image2 {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('@/img/3.png') no-repeat center center;
background-size: contain;
background-position: center;
z-index: -1;
transform: translateY(200px);
}
</style>

189
activitylink/src/views/zhongchou/user/index.vue

@ -0,0 +1,189 @@
<template>
<el-card style="margin-top: 50px; min-height: 90vh; max-height: 90vh;">
<!-- 搜索栏 -->
<div class="gray-container">
<h2>用户管理</h2>
<el-form :inline="true" class="search-bar">
<el-form-item label="姓名">
<el-input v-model="searchParams.username" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="精网号">
<el-input
v-model="searchParams.jwcode"
placeholder="请输入精网号"
@input="handleJingwangIdInput"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addusershow">添加用户</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<div class="table-container">
<el-table :data="tableData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column prop="username" label="姓名" width="180" align="center"></el-table-column>
<el-table-column prop="jwcode" label="精网号" width="250" align="center"></el-table-column>
<el-table-column prop="gradeName" label="中奖等级" width="200" align="center"></el-table-column>
<el-table-column prop="prizeName" label="所中礼品" width="300" align="center"></el-table-column>
<el-table-column prop="winTime" label="中奖时间" align="center"></el-table-column>
</el-table>
</div>
</div>
<!-- 分页组件 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParams.pageNum"
:page-sizes="[10, 20, 50, 100]"
:page-size="searchParams.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</el-card>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useactivityStone } from '@/stone/activityStone'
import { useWinStone } from '@/stone/winStone'
import { getWinList, getWinLevelList ,exportWinExcel} from '@/api/manage/win'
import { onBeforeRouteLeave } from 'vue-router'
import { ElMessage } from 'element-plus'
const activityStone = useactivityStone()
const winStone = useWinStone()
// 使
const searchParams = ref({
pageNum: 1,
pageSize: 10,
username: "",
jwcode: ""
})
//
const tableData = ref([])
const total = ref(0)
const handleSizeChange = (val) => {
searchParams.value.pageSize = val
searchParams.value.pageNum = 1
fetchWinList()
}
const handleCurrentChange = (val) => {
searchParams.value.pageNum = val
fetchWinList()
}
//
const fetchWinList = async () => {
try {
const requestData = {
username: activityStone.searchUsername,
gradeId: "" ,
jwcode: activityStone.searchJwcode,
pageNum: searchParams.value.pageNum,
pageSize: searchParams.value.pageSize
}
console.log('请求参数:', requestData)
const res = await getWinList(requestData)
if (res.code === 200) {
tableData.value = res.data.list
console.log('获取中奖列表成功:', tableData.value)
total.value = res.data.total
}
} catch (error) {
console.error('获取中奖列表失败:', error)
}
}
//
const handleSearch = () => {
searchParams.value.pageNum = 1
// //
// activityStone.setSearchUsername(searchParams.value.username)
// activityStone.setSearchJwcode(searchParams.value.jwcode)
// winStone.setSearchgradeId(searchParams.value.gradeId)
fetchWinList()
}
//
const handleReset = () => {
searchParams.value = {
pageNum: 1,
pageSize: 10,
username: '',
gradeId: '',
jwcode: ''
}
//
// activityStone.setSearchUsername('')
// activityStone.setSearchJwcode('')
// winStone.setSearchgradeId('')
fetchWinList()
}
//
const handleJingwangIdInput = (value) => {
searchParams.value.jwcode = value.replace(/\D/g, '')
}
//
onMounted(() => {
fetchWinList()
})
// onBeforeRouteLeave((to, from, next) => {
// // activity/index
// if (to.name !== 'zhongchouwinning') {
// // winStone gradeId
// winStone.setSearchgradeId('')
// // activityStone
// activityStone.setSearchUsername('')
// activityStone.setSearchJwcode('')
// }
// next() // next()
// })
</script>
<style scoped>
.gray-container {
width: 100%;
background-color: #ffffff;
padding: 20px;
box-sizing: border-box;
min-height: 80vh;
overflow-x: hidden;
}
.search-bar {
margin-bottom: 20px;
}
.prize-level-select {
width: 220px;
}
.table-container {
height: 600px;
overflow-y: auto;
}
</style>

10
activitylink/src/views/zhongchou/winning/index.vue

@ -107,14 +107,14 @@ const fetchWinLevelList = async () => {
}
const handleSizeChange = (val) => {
pagination.value.pageSize = val
pagination.value.pageNum = 1
getPrizes()
searchParams.value.pageSize = val
searchParams.value.pageNum = 1
fetchWinList()
}
const handleCurrentChange = (val) => {
pagination.value.pageNum = val
getPrizes()
searchParams.value.pageNum = val
fetchWinList()
}
//
const fetchWinList = async () => {

19
activitylink/vite.config.js

@ -3,7 +3,6 @@ import vue from '@vitejs/plugin-vue';
import path from 'path';
export default defineConfig({
// 设置打包后静态资源的基础路径为 testBack
base: '/testBack/',
plugins: [vue()],
resolve: {
@ -14,18 +13,10 @@ export default defineConfig({
server: {
proxy: {
'/api': {
target: 'https://dbqb.nfdxy.net', // 后端基础地址
target: 'https://dbqb.nfdxy.net',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''), // 移除 /api 前缀
// 或者更精确的重写(根据后端路径调整):
// rewrite: (path) => path.replace(/^\/api\/admin/, '/admin'),
rewrite: (path) => path.replace(/^\/api/, '')
},
'/upload': {
target: 'http://39.101.133.168:8828',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/upload/, ''),
}
},
},
},
);
}
}
});
Loading…
Cancel
Save