// ==UserScript==
// @name cpcapi
// @namespace https://bbs.tampermonkey.net.cn/
// @version 9
// @description 此脚本为简化她的工作流程而设计。
// @author Zemelee
// @match https://cpcapi.cbg.cn/newEraPlatform/#/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
/*
# 专有许可证
版权所有 (C) [2025] Zemelee
本软件受专有许可证保护。未经许可,任何人不得:
- 修改本软件的任何部分。
- 复制、分发或传播本软件。
- 将本软件用于商业用途。
本软件仅供个人查看和学习使用,严禁任何未经授权的行为。
联系信息:
[email protected]
*/
(async function () {
'use strict';
let mode = localStorage.getItem("mode");
if (mode == null || mode == void 0) {
mode = "新增活动模式"; // 默认新增活动模式
}
let header = document.querySelector("#app > section > section > header > div.currentBox")
let modeSelect = document.createElement("select")
modeSelect.style.marginLeft = "10px"
let options = [
{ text: "新增活动模式", value: "新增活动模式" },
{ text: "录入人员模式", value: "录入人员模式" },
{ text: "审核模式", value: "审核模式" },
{ text: "补录模式", value: "补录模式" },
{ text: "审核补录", value: "审核补录" },
];
options.forEach(function (option) {
let optionElement = document.createElement("option");
optionElement.textContent = option.text;
optionElement.value = option.value;
if (mode === option.value) { //默认 新增活动模式
optionElement.selected = true;
}
modeSelect.appendChild(optionElement);
});
modeSelect.addEventListener('change', function () {
let selectedMode = modeSelect.value;
localStorage.setItem("mode", selectedMode);
setTimeout(location.reload(), 1000)
});
header.appendChild(modeSelect)
console.log("mode1:", mode)
console.log("mode2:", location.href.includes("volunteerActivityUserList"))
//新增活动模式
if (mode == "新增活动模式" && window.location.href.includes("volunteerActivityList")) {
const styles = {
newDiv: {
// border: "1px solid red",
width: "47%",
height: "auto",
padding: "0 10px",
margin: "10px",
backgroundColor: "white"
},
input: {
width: "300px"
},
dateSelect: { //日期选择
width: "150px",
margin: "10px"
},
serviceSelect: { //服务方向选择
width: "100px"
},
submitButton: {
className: "btn searchBtn",
background: "#18b4a3",
border: "0px",
color: "#fff",
cursor: "pointer",
width: ".4583rem",
height: ".1667rem",
marginLeft: "15px"
}
};
function createStyledElement(tagName, styles) {
const element = document.createElement(tagName);
Object.assign(element.style, styles); // 将 styles 对象中的属性和值复制到 element.style 对象
return element;
}
const ActivityForm = document.querySelector("#app > section > section > main > div > div.navSelect");
const newDiv = createStyledElement("div", styles.newDiv);
// 创建表单元素
const form = document.createElement("form");
// 活动名称输入框
const activityTitleInput = createStyledElement("input", styles.input);
activityTitleInput.type = "text";
activityTitleInput.value = "建工村社区开展";
activityTitleInput.className = "el-input__inner"
activityTitleInput.name = "activityTitle";
activityTitleInput.placeholder = "活动名称";
form.appendChild(activityTitleInput);
// 活动时间选择器
let now = new Date();
const activityStartTimeSelect = createStyledElement("select", styles.dateSelect);
activityStartTimeSelect.className = "el-input__inner"
activityStartTimeSelect.name = "activityStartTime";
activityStartTimeSelect.placeholder = "活动开始时间";
// 生成当前日期及其前30天的10:00和14:00选项
for (let i = 0; i <= 30; i++) {
const date = new Date(now);
date.setDate(now.getDate() - i);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const dateStr = `${year}-${month}-${day}`;
const option1 = document.createElement("option");
option1.value = `${dateStr} 10:00`;
option1.textContent = `${dateStr} 10:00`;
const option2 = document.createElement("option");
option2.value = `${dateStr} 14:00`;
option2.textContent = `${dateStr} 14:00`;
activityStartTimeSelect.appendChild(option1);
activityStartTimeSelect.appendChild(option2);
}
form.appendChild(activityStartTimeSelect);
// 服务方向
const activities = [
{ value: '9da78dfafb934cdeab788e5f83b6da43', textContent: '乡村振兴' },
{ value: '8c0bcd11a9c54ac88c714d4d417b5beb', textContent: '亲子互动' },
{ value: '7bd3b95bdcd24f34aaacb7e556a37c7b', textContent: '劳动实践' },
{ value: '4a233184bb8949329d2eac3a8c62aad5', textContent: '红色研学' },
{ value: '0cbf4b4397154c6ab34d400739d49437', textContent: '理论学习' },
{ value: '1747b3642cea45caa28ef38da41e70de', textContent: '理论宣传' },
{ value: '0689501c809041dbb937771e90140f48', textContent: '理论宣讲' },
{ value: 'jiaoyupeixun', textContent: '教育培训' },
{ value: 'huodongceihua', textContent: '活动策划' },
{ value: 'wenhuayishu', textContent: '文化艺术' },
{ value: 'shengtaihuanbao', textContent: '生态环保' },
{ value: 'shequfuwu', textContent: '社区服务' }
];
const serviceContentSelect = createStyledElement("select", styles.serviceSelect);
serviceContentSelect.className = "el-input__inner"
serviceContentSelect.name = "serviceContent";
activities.forEach(activity => {
const option = document.createElement("option");
option.value = activity.value;
option.textContent = activity.textContent;
serviceContentSelect.appendChild(option);
});
form.appendChild(serviceContentSelect);
// 提交按钮
const submitButton = createStyledElement("button", styles.submitButton);
submitButton.type = "submit";
submitButton.textContent = "提交";
form.appendChild(submitButton);
newDiv.appendChild(form);
ActivityForm.appendChild(newDiv);
// 监听表单提交事件
form.addEventListener("submit", function (event) {
event.preventDefault();
if (activityTitleInput.value.length <= 7) {
showMessage("活动名称太短啦~")
return
}
let activityStartTime = activityStartTimeSelect.value;//2024-06-16 10:00
let activityEndTime = formatTime(activityStartTime, 0, 1);
const formData = {
activityTitle: activityTitleInput.value,
recruitStartTime: getRecruitTime(activityStartTime, 1),
recruitEndTime: getRecruitTime(activityStartTime, 0),
activityStartTime: activityStartTime,
activityEndTime: activityEndTime,
serviceContent: serviceContentSelect.value,
};
// 合并 formData 到 ReqBody
const ReqBody = {
...formData,
"activityProfile": formData.activityTitle,
"contactPhone": "65126464",
"publishOrganization": "c108032b4bf5467a86b7b1ac3ce2ff21",
"requireUserCount": "40",
"activityIntegral": "5",
"activityRequire": "",
"activityGuarantee": "",
"activityPicture": "",
"publishOrganizationType": 20,
"activityAddress": "重庆市沙坪坝区重庆大学(B区)",
"joinDistance": 5000,
"mapCoordinate": "106.468165,29.573403",
"serviceType": "",
"status": 10
};
// 发送 fetch 请求
fetch("https://cpcapi.cbg.cn/manageapi/volunteerActivity/add?_t=1719644928", {
method: "POST",
headers: {
"Content-Type": "application/json",
"usertoken": localStorage.getItem("TOKEN"),
},
body: JSON.stringify(ReqBody),
})
.then(response => response.json())
.then(data => {
if (data.msg == "成功") {
showMessage("提交成功")
activityTitleInput.value = ""
} else {
showMessage("提交失败")
}
})
.catch(error => {
showMessage("提交失败")
});
});
}
//录入人员模式
if (mode == "录入人员模式" && window.location.href.includes("volunteerActivityList")) {
const activitiesContainer = document.createElement("div");
activitiesContainer.style.margin = "5px";
activitiesContainer.style.fontSize = "20px";
activitiesContainer.style.overflowY = "auto";
activitiesContainer.style.maxHeight = "150px";
// 请求志愿者未满的活动,并生成多选列表
let allActivities = await getActivities(); //包含title、code
allActivities.forEach(activity => {
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = `activity_${activity.id}`;
checkbox.value = activity.activityCode;
// checkbox.setAttribute('registUserCount', activity.registUserCount);
// checkbox.setAttribute('requireUserCount', activity.requireUserCount);
const label = document.createElement('label');
label.textContent = activity.activityTitle;
activitiesContainer.appendChild(checkbox);
activitiesContainer.appendChild(label);
activitiesContainer.appendChild(document.createElement('br')); // 换行
});
// 提交按钮/提示按钮
const submitButton = document.createElement("button");
submitButton.type = "submit";
submitButton.style.height = ".1067rem"
submitButton.style.background = "#18b4a3"
submitButton.style.border = "0px"
submitButton.style.color = "#fff"
submitButton.style.marginLeft = "15px";
if (allActivities.length > 0) {
submitButton.style.width = ".4083rem"
submitButton.style.cursor = "pointer"
submitButton.textContent = "提交";
let allVoluntees = await getAllVoluntees(); //请求所有志愿者信息
submitButton.addEventListener('click', async () => {
const selectedItems = [];
// 收集选中的活动代码
allActivities.forEach(activity => {
const checkbox = document.getElementById(`activity_${activity.id}`);
if (checkbox.checked) {
selectedItems.push({ "code": activity.activityCode, "need": activity.requireUserCount - activity.registUserCount });
}
});
selectedItems.forEach(selectedItem => {
addVoluntees(selectedItem.code, r40tees(allVoluntees, selectedItem.need)) //每个活动的需要不同的40志愿者
})
});
} else {
submitButton.style.width = ".6083rem"
submitButton.textContent = "暂无活动可补录";
}
activitiesContainer.appendChild(submitButton)
const footer = document.querySelector("#app > section > section > main > div > div.pageList")
footer.style.height = "200px"
footer.appendChild(activitiesContainer)
}
if (mode == "审核模式" && window.location.href.includes("volunteerActivityUserList")) {
let navBar = document.querySelector(".volunteerList>.navBar")
let allSelect = document.querySelector("table>thead>tr>th>div>label")
let batchPass = document.querySelector(".volunteerList>.navBar>div>div:nth-child(1)")
let batchRefuse = document.querySelector(".volunteerList>.navBar>div>div:nth-child(2)")
// let confirmBtn = document.querySelector("body > div.el-message-box__wrapper > div > div.el-message-box__btns > button.el-button.el-button--default.el-button--small.el-button--primary")
let startDiv = document.createElement("button")
startDiv.className = "itemBtn icon"
startDiv.style.height = ".3067rem"
startDiv.style.background = "#18b4a3"
startDiv.style.color = "#fff"
startDiv.textContent = "开始审核"
startDiv.addEventListener("click", function () {
setTimeout(async () => {
for (let i = 0; i < 120; i++) {
try {
await allSelect.click();
await new Promise(resolve => setTimeout(resolve, 600));
await batchPass.click();
// await batchRefuse.click();
await new Promise(resolve => setTimeout(resolve, 600));
let allButtons = document.querySelectorAll('button');
let confirmBtn = Array.from(allButtons).find(btn => btn.textContent.trim() === '确定');
confirmBtn.click();
await new Promise(resolve => setTimeout(resolve, 2500));
} catch (err) {
console.error(`第 ${i + 1} 次审核成员时出错:`, err);
}
}
}, 100)
})
navBar.appendChild(startDiv)
// 搭配python脚本一起使用
// import pyautogui
// import time
// # 设置要点击的屏幕坐标
// x, y = 1836, 436 # 请根据实际情况修改坐标
// a, b = 1128, 636
// time.sleep(2)
// for i in range(1, 20): # 连续点击10次
// pyautogui.click(x, y)
// time.sleep(1.6)
// pyautogui.click(a, b)
// time.sleep(1)
}
if (mode == "补录模式" && window.location.href.includes("volunteerActivityList")) {
let supplementalBtn = document.createElement("button")
supplementalBtn.textContent = "一键补录"
supplementalBtn.type = "submit"
supplementalBtn.classList.add("item", "btn")
// 将样式属性应用到按钮上
supplementalBtn.style.background = "#18b4a3";
supplementalBtn.style.border = "0px";
supplementalBtn.style.color = "#fff";
supplementalBtn.style.cursor = "pointer";
supplementalBtn.style.width = ".4583rem";
supplementalBtn.style.height = ".1667rem";
supplementalBtn.style.marginLeft = "15px";
supplementalBtn.addEventListener("click", function () {
lastStep()
})
document.querySelector("#app>section>section>main>div>div.navSelect").appendChild(supplementalBtn)
}
if (mode == "审核补录" && window.location.href.includes("activityPunchTheClock")){
let navBar = document.querySelector("div.navBar >div.itemList")
let allSelect = document.querySelector(".volunteerForm table>thead>tr>th>div>label");
let batchPass = document.querySelector("div.itemList>div:nth-child(2)");
let startDiv = document.createElement("button")
startDiv.className = "itemBtn icon"
let styleText = `
font-weight: 400;
text-align: left;
font-size: 12px;
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
flex-direction: row;
height: 0.2083rem;
width: 0.5208rem;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
color: rgb(255, 255, 255);
background-color: rgb(24, 180, 163);
margin-left: 10px;
`;
startDiv.style.cssText = styleText;
startDiv.textContent = "开始审核"
startDiv.addEventListener("click", function () {
setTimeout(async () => {
for (let i = 0; i < 120; i++) {
try {
await allSelect.click();
await new Promise(resolve => setTimeout(resolve, 600));
await batchPass.click();
// await batchRefuse.click();
await new Promise(resolve => setTimeout(resolve, 600));
let allButtons = document.querySelectorAll('button');
let confirmBtn = Array.from(allButtons).find(btn => btn.textContent.trim() === '确定');
confirmBtn.click();
await new Promise(resolve => setTimeout(resolve, 2500));
} catch (err) {
console.error(`第 ${i + 1} 次审核成员时出错:`, err);
}
}
}, 100)
})
navBar.appendChild(startDiv)
}
function waitSeconds(sec = 3) {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, sec * 1000);
});
}
// 请求某一活动需要补录的人员信息
async function getSupplemental(actvtCode) {
const volunteerCodeParams = {
_t: Date.now().toString().substring(0, 10),
activityCode: actvtCode,
status: 20
}
const urlParams = new URLSearchParams(volunteerCodeParams).toString()
const response = await fetch(`https://cpcapi.cbg.cn/manageapi/volunteerActivityUser/all?${urlParams}`, {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5",
"cache-control": "no-cache",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Microsoft Edge\";v=\"132\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"usertoken": localStorage.getItem("TOKEN")
},
"referrer": "https://cpcapi.cbg.cn/newEraPlatform/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "include"
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const res = await response.json();
let volunteers;
if (res.code === 1000) {
volunteers = res.data.map(item => item.volunteerUser)
} else {
showMessage("获取志愿者信息失败!")
}
return volunteers
}
// 请求活动时间信息
// 返回活动的招募、开始的开始结束时间和活动id
async function getActivityInfo(actvtCode) {
const p = {
_t: Date.now().toString().substring(0, 10),
activityCode: actvtCode,
activityStatus: 50,
}
let urlp = new URLSearchParams(p).toString()
const response = await fetch(`https://cpcapi.cbg.cn/manageapi/volunteerActivity/all?${urlp}`, {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5",
"cache-control": "no-cache",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Microsoft Edge\";v=\"132\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"usertoken": localStorage.getItem("TOKEN")
},
"referrer": "https://cpcapi.cbg.cn/newEraPlatform/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "include"
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const res = await response.json();
if (res.code == 1000) {
return {
recruitStartTime: res.data[0].recruitStartTime,
recruitEndTime: res.data[0].recruitEndTime,
activityStartTime: res.data[0].activityStartTime,
activityEndTime: res.data[0].activityEndTime,
activityCode: res.data[0].activityCode
};
} else {
showMessage("请求活动信息失败")
console.log("请求活动信息失败:", res)
}
}
// 发送补录请求
async function postSupplemental(actvtCode) {
// 包含活动时间信息
let actvtInfo = await getActivityInfo(actvtCode)
await waitSeconds(3)
// 包含这个活动的录入志愿者列表
let vluntrInfo = await getSupplemental(actvtCode)
const pa = {
"activityCode": actvtCode,
"areaCode": "24e61de1dd254f6f821a0cc2217caa4a",
"integral": 10,
"joinActivityTime": actvtInfo.recruitStartTime,
"punchStartTime": actvtInfo.activityStartTime,
"punchEndTime": actvtInfo.activityEndTime,
"punchTimeLength": 7200,
"volunteerUserCode": vluntrInfo
}
const response = await fetch("https://cpcapi.cbg.cn/manageapi/volunteerActivitySup/add?_t=1737863006", {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5",
"cache-control": "no-cache",
"content-type": "application/json",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Microsoft Edge\";v=\"132\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"usertoken": localStorage.getItem("TOKEN")
},
"referrer": "https://cpcapi.cbg.cn/newEraPlatform/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": JSON.stringify(pa),
"method": "POST",
"mode": "cors",
"credentials": "include"
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const res = await response.json();
if (res.code == 1000) {
showMessage("补录成功")
} else {
showMessage("补录失败")
console.log("补录失败", res)
}
}
// 最后一步!批量补录某些活动的志愿者时长
// async function lastStep() {
// // 已经录入完成的活动
// // enter=1:获取已经录入完成的活动
// let activities = await getActivities(1, 1, 5)
// try {
// let results = await Promise.all(activities.map(item => postSupplemental(item.activityCode)));
// console.log('所有补录请求结束', results);
// } catch (error) {
// console.error('补录请求过程中发生错误', error);
// }
// }
// 最后一步!批量补录某些活动的志愿者时长
async function lastStep() {
const totalActivities = 30; // 总共需要处理的活动数量
const pageSize = 5; // 每页大小
const totalPages = Math.ceil(totalActivities / pageSize); // 计算总页数
for (let page = 1; page <= totalPages; page++) {
try {
let activities = await getActivities(1, page, pageSize);
if (activities.length === 0) {
showMessage(`第 ${page} 页没有更多活动,提前结束`);
break;
}
let results = await Promise.all(activities.map(item => postSupplemental(item.activityCode)));
showMessage(`第 ${page} 页补录请求结束`);
console.log(results)
} catch (error) {
showMessage(`第 ${page} 页补录请求过程中发生错误`);
}
await waitSeconds(4)
}
}
//请求活动信息:获取录入人员未满的活动code
async function getActivities(enter = 0, pn = 1, ps = 30) {
// enter=0:获取已经未录入完成的活动
// enter=1:获取已经录入完成的活动,用于补录
// pn,pageNumber,第几页;ps:pageSize,每页大小
const response = await fetch(`https://cpcapi.cbg.cn/manageapi/volunteerActivity/list?_t=1719818494&pageNumber=${pn}&pageSize=${ps}&status=20`, {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"priority": "u=1, i",
"sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"usertoken": localStorage.getItem("TOKEN")
},
"referrer": "https://cpcapi.cbg.cn/newEraPlatform/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "omit"
})
if (!response.ok) {
throw new Error('Network response was not ok');
}
const res = await response.json();
if (res.msg != "成功") {
showMessage("获取活动信息失败");
return;
}
let allRes = res.data.result;
if (enter) {
// 获取已经录入完成的活动,用于补录
allRes = allRes.filter(item => item.registUserCount == item.requireUserCount);
} else {
//默认支线
allRes = allRes.filter(item => item.registUserCount < item.requireUserCount || !item.registUserCount);
}
return allRes;
}
//请求志愿者信息
async function getAllVoluntees() {
const response = await fetch("https://cpcapi.cbg.cn/manageapi/volunteerTeamUser/list?_t=1719816537&pageNumber=1&pageSize=9999&teamCode=3dabbfb2abc54138bcc3ecc72ba70a02&status=20&areaCode=49bc0e0716b54a60b693e790b56c472b", {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"priority": "u=1, i",
"sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"usertoken": localStorage.getItem("TOKEN")
},
"referrer": "https://cpcapi.cbg.cn/newEraPlatform/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "omit"
})
if (!response.ok) {
throw new Error('Network response was not ok');
}
const res = await response.json();
if (res.msg != "成功") {
showMessage("获取志愿者信息失败")
return
}
return res.data.result
}
function r40tees(allVoluntees, need = 40) {
let randomIndices = new Set();
while (randomIndices.size < need) {
let randomIndex = Math.floor(Math.random() * allVoluntees.length);
randomIndices.add(randomIndex);
}
let rIndices = Array.from(randomIndices)
let volunteerUsers = rIndices.map(index => allVoluntees[index].volunteerUser); //随机40个志愿者id
return volunteerUsers;
}
//补录志愿者信息
async function addVoluntees(activityCode, volunteerUsers) {
let reqBody = {
"activityCode": activityCode,
"volunteerUsers": volunteerUsers
}
const response = await fetch("https://cpcapi.cbg.cn/manageapi/volunteerActivityUser/batchAdd?_t=1719816951", {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"priority": "u=1, i",
"sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"usertoken": localStorage.getItem("TOKEN")
},
"referrer": "https://cpcapi.cbg.cn/newEraPlatform/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": JSON.stringify(reqBody),
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const res = await response.json();
if (res.msg != "成功") {
showMessage("志愿者补录失败")
return
}
showMessage("志愿者补录成功")
}
function formatTime(AST, day = 0, hour = 0) {
AST = new Date(AST);
let resTime;
if (day) {
// 增加1天
let nextDate = new Date(AST.getTime());
nextDate.setDate(AST.getDate() + 1);
resTime = `${nextDate.getFullYear()}-${pad(nextDate.getMonth() + 1)}-${pad(nextDate.getDate())} ${pad(AST.getHours())}:${pad(AST.getMinutes())}`;
} else if (hour) {
// 增加2小时
let nextHour = new Date(AST.getTime());
nextHour.setHours(AST.getHours() + 2);
resTime = `${nextHour.getFullYear()}-${pad(nextHour.getMonth() + 1)}-${pad(nextHour.getDate())} ${pad(nextHour.getHours())}:${pad(AST.getMinutes())}`;
} else {
// 没有增加
resTime = `${AST.getFullYear()}-${pad(AST.getMonth() + 1)}-${pad(AST.getDate())} ${pad(AST.getHours())}:${pad(AST.getMinutes())}`;
}
return resTime;
}
function getRecruitTime(AST, start = 0) {
AST = new Date(AST);
let resTime = new Date(AST.getTime());
if (resTime.getHours() == 10) { //上午
resTime.setHours(9)
} else { //下午
resTime.setHours(12)
}
if (start) {
resTime.setDate(resTime.getDate() - 1);//前一天开始招募
}
return formatTime(resTime); //招募结束日期即活动日期
}
function pad(number) {
if (number < 10) {
return '0' + number;
}
return number;
}
let messageBox = null;
function showMessage(text) {
if (messageBox) {
document.body.removeChild(messageBox);
}
messageBox = document.createElement('div');
messageBox.textContent = text;
messageBox.style.cssText = `
position: fixed;
top: 10px;
left: 50%;
transform: translateX(-50%);
background-color: rgba(0, 0, 0, 0.8);
color: white;
padding: 10px 20px;
border-radius: 5px;
z-index: 9999;
`;
document.body.appendChild(messageBox);
setTimeout(() => {
document.body.removeChild(messageBox);
messageBox = null; // 释放引用,准备下一次使用
}, 4000); // 4 seconds
}
})();