diff --git a/.vscode/settings.json b/.vscode/settings.json index a0228de..aee10d6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,14 +2,14 @@ "typescript.tsdk": "./node_modules/typescript/lib", "npm.packageManager": "pnpm", "editor.tabSize": 2, - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.quickSuggestions": { "other": true, "comments": true, "strings": true }, - "editor.codeActionsOnSave": { + "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.fixAll.eslint": "explicit", "source.fixAll.stylelint": "explicit" @@ -67,7 +67,9 @@ "i18n-ally.sortKeys": true, "i18n-ally.namespace": false, "i18n-ally.pathMatcher": "{namespaces}/{locale}.{ext}", - "i18n-ally.enabledParsers": ["ts"], + "i18n-ally.enabledParsers": [ + "ts" + ], "i18n-ally.sourceLanguage": "en", "i18n-ally.displayLanguage": "zh-CN", "i18n-ally.enabledFrameworks": [ @@ -93,5 +95,8 @@ "files.associations": { "*.ttml": "xml", "*.ttss": "css" + }, + "[javascript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" } -} +} \ No newline at end of file diff --git a/src/api/account/coupon.ts b/src/api/account/coupon.ts index 1bc848c..e259f11 100644 --- a/src/api/account/coupon.ts +++ b/src/api/account/coupon.ts @@ -4,7 +4,7 @@ const baseURL = Market_BaseUrl + "/admin/coupon"; const API = { getList(params: getListRequest) { return request({ - url: `${baseURL}`, + url: `${baseURL}/page`, method: "get", params }); diff --git a/src/api/coupon/index.js b/src/api/coupon/index.js index 08688c7..c2ea4fc 100644 --- a/src/api/coupon/index.js +++ b/src/api/coupon/index.js @@ -2,7 +2,8 @@ import request from "@/utils/request"; import { Account_BaseUrl, Product_BaseUrl, - Market_BaseUrl + Market_BaseUrl, + System_BaseUrl } from "@/api/config"; // 获取分店列表 @@ -13,6 +14,14 @@ export function getBranchPage() { }); } +// 店铺分店列表(下拉展示主店和分店使用,默认第一个是主店,其余是分店) +export function getBranchList() { + return request({ + url: `${Account_BaseUrl + "/admin/shopInfo/branchList"}`, + method: "get", + }); +} + // 获取商品-列表 export function getProductList() { return request({ @@ -161,4 +170,266 @@ export function getShopUserList(params) { method: 'get', params }); -} \ No newline at end of file +} + +// 消费返现 配置信息获取 +export function consumeCashback() { + return request({ + url: `${Market_BaseUrl + "/admin/consumeCashback"}`, + method: 'get' + }); +} + +// 消费返现 配置信息修改 +export function consumeCashbackPost(data) { + return request({ + url: `${Market_BaseUrl + "/admin/consumeCashback"}`, + method: 'post', + data + }); +} + +// 消费返现 记录获取 +export function consumeCashbackRecord(params) { + return request({ + url: `${Market_BaseUrl + "/admin/consumeCashback/record"}`, + method: 'get', + params + }); +} + +// 满减活动 配置信息获取 +export function discountActivityPage(params) { + return request({ + url: `${Market_BaseUrl + "/admin/discountActivity/page"}`, + method: 'get', + params + }); +} + +// 满减活动 新增 +export function discountActivity(data, method = 'post') { + return request({ + url: `${Market_BaseUrl + "/admin/discountActivity"}`, + method: method, + data + }); +} + +// 满减活动 删除 +export function discountActivityDelete(id) { + return request({ + url: `${Market_BaseUrl + "/admin/discountActivity"}?id=${id}`, + method: 'DELETE' + }); +} + +// 店铺详情 +export function shopInfoGet() { + return request({ + url: `${Account_BaseUrl + "/admin/shopInfo/detail"}`, + method: 'get' + }); +} + +// 店铺编辑 +export function shopInfoPut(data) { + return request({ + url: `${Account_BaseUrl + "/admin/shopInfo"}`, + method: 'put', + data + }); +} + +// 私域引流 配置信息获取 +export function drainageConfigGet() { + return request({ + url: `${Market_BaseUrl + "/admin/drainageConfig"}`, + method: 'get' + }); +} + +// 私域引流 配置信息修改 +export function drainageConfigPost(data) { + return request({ + url: `${Market_BaseUrl + "/admin/drainageConfig"}`, + method: 'post', + data + }); +} + +// 短信模板 新增 +export function smsTemplate(data) { + return request({ + url: `${Market_BaseUrl + "/admin/smsTemplate"}`, + method: 'post', + data + }); +} + +// 短信模板 重新提交 +export function smsTemplateResubmit(data) { + return request({ + url: `${Market_BaseUrl + "/admin/smsTemplate/resubmit"}`, + method: 'post', + data + }); +} + +// 短信模板 列表 +export function smsTemplateGet() { + return request({ + url: `${Market_BaseUrl + "/admin/smsTemplate"}`, + method: 'get', + }); +} + +// 短信模板 列表 管理员专用 +export function smsTemplatePage(data) { + return request({ + url: `${Market_BaseUrl + "/admin/smsTemplate/query"}`, + method: 'post', + data + }); +} + +// 获取短信发送用户 +export function getPushEventUser(data) { + return request({ + url: `${Account_BaseUrl + "/admin/shopUser/getPushEventUser"}`, + method: 'post', + data + }); +} + +// 短信推送任务 新增 +export function pushEventPost(data, method = 'post') { + return request({ + url: `${Market_BaseUrl + "/admin/pushEvent"}`, + method: method, + data + }); +} + +// 短信推送任务 列表 +export function pushEventGet(params) { + return request({ + url: `${Market_BaseUrl + "/admin/pushEvent"}`, + method: 'get', + params + }); +} + +// 短信推送任务 删除任务 +export function pushEventDel(id) { + return request({ + url: `${Market_BaseUrl}/admin/pushEvent/${id}`, + method: 'DELETE' + }); +} + +// 获取店铺短信余额明细 +export function smsMoneyDetail(params) { + return request({ + url: `${Market_BaseUrl + "/admin/smsMoneyDetail"}`, + method: 'get', + params + }); +} + +// 霸王餐 配置信息获取 +export function freeDingGet(params) { + return request({ + url: `${Account_BaseUrl + "/admin/freeDing"}`, + method: 'get', + params + }); +} + +// 霸王餐 修改霸王餐配置信息 +export function freeDingPut(data) { + return request({ + url: `${Account_BaseUrl + "/admin/freeDing"}`, + method: 'put', + data + }); +} + +// 平台 模板状态/删除 +export function shopUseDelStatus(data) { + return request({ + url: `${Market_BaseUrl + "/admin/smsTemplate/shopUse"}`, + method: 'post', + data + }); +} + +// 配置信息获取 +export function adminSmsMoneyPage(params) { + return request({ + url: `${Market_BaseUrl + "/admin/smsMoney/page"}`, + method: 'get', + params + }); +} + +// 变更店铺短信余额 +export function smsMoneyChange(data) { + return request({ + url: `${Market_BaseUrl + "/admin/smsMoney/change"}`, + method: 'post', + data + }); +} + +// 平台 获取店铺短信余额明细 +export function smsMoneyDetailQuery(data) { + return request({ + url: `${Market_BaseUrl + "/admin/smsMoneyDetail/query"}`, + method: 'post', + data + }); +} + +// 获取店铺短信余额 +export function smsMoneyGet() { + return request({ + url: `${Market_BaseUrl + "/admin/smsMoney"}`, + method: 'get' + }); +} + +// 获取发送短信单价 +export function smsMoneyGetFee() { + return request({ + url: `${System_BaseUrl + "/admin/sysParams/code/sms_fee"}`, + method: 'get' + }); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/utils/index.ts b/src/utils/index.ts index 08c7c70..5d84054 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,10 +1,11 @@ +import { BigNumber } from "bignumber.js"; /** * Check if an element has a class * @param {HTMLElement} ele * @param {string} cls * @returns {boolean} */ -export function hasClass(ele : HTMLElement, cls : string) { +export function hasClass(ele: HTMLElement, cls: string) { return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); } @@ -13,7 +14,7 @@ export function hasClass(ele : HTMLElement, cls : string) { * @param {HTMLElement} ele * @param {string} cls */ -export function addClass(ele : HTMLElement, cls : string) { +export function addClass(ele: HTMLElement, cls: string) { if (!hasClass(ele, cls)) ele.className += " " + cls; } @@ -22,7 +23,7 @@ export function addClass(ele : HTMLElement, cls : string) { * @param {HTMLElement} ele * @param {string} cls */ -export function removeClass(ele : HTMLElement, cls : string) { +export function removeClass(ele: HTMLElement, cls: string) { if (hasClass(ele, cls)) { const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); ele.className = ele.className.replace(reg, " "); @@ -35,7 +36,7 @@ export function removeClass(ele : HTMLElement, cls : string) { * @param {string} path * @returns {Boolean} */ -export function isExternal(path : string) { +export function isExternal(path: string) { const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path); return isExternal; } @@ -46,7 +47,7 @@ export function isExternal(path : string) { * @param growthRate * @returns */ -export function formatGrowthRate(growthRate : number) { +export function formatGrowthRate(growthRate: number) { if (growthRate === 0) { return "-"; } @@ -62,7 +63,7 @@ export function formatGrowthRate(growthRate : number) { * @param {string} cFormat * @returns {string} */ -export function parseTime(time : string | number | Date | null, cFormat : string | undefined) { +export function parseTime(time: string | number | Date | null, cFormat: string | undefined) { if (arguments.length === 0) { return null; } @@ -90,7 +91,7 @@ export function parseTime(time : string | number | Date | null, cFormat : string s: date.getSeconds(), a: date.getDay() }; - const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key : keyof typeof formatObj) : string => { + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key: keyof typeof formatObj): string => { let value = formatObj[key]; // Note: getDay() returns 0 on Sunday if (key === "a") { @@ -105,7 +106,7 @@ export function parseTime(time : string | number | Date | null, cFormat : string } // 下载文件 -export function downloadFile(obj : BlobPart, name : string, suffix : string, useUnix = true) { +export function downloadFile(obj: BlobPart, name: string, suffix: string, useUnix = true) { const url = window.URL.createObjectURL(new Blob([obj])); const link = document.createElement("a"); link.style.display = "none"; @@ -133,9 +134,9 @@ export function isSyncStatus() { /** * 判断是否有某权限 */ -export function hasPermission(params : any) { +export function hasPermission(params: any) { let $PermissionObj = JSON.parse(localStorage.getItem("permission") || '[]') - const obj = $PermissionObj.find((v : any) => v == params || v == params) + const obj = $PermissionObj.find((v: any) => v == params || v == params) if (obj) { return obj } @@ -232,4 +233,30 @@ export function convertTimeToDate(timeStr, options = {}) { // 5. 按指定格式返回日期字符串 return dateObj.format(format); -} \ No newline at end of file +} + +/** + * 乘法计算并格式化结果 + * @param {string|number} num1 - 第一个乘数 + * @param {string|number} num2 - 第二个乘数 + * @returns {string} 保留两位小数的结果(不四舍五入,补零) + */ +export const multiplyAndFormat = (num1: any, num2: any = 1): string => { + try { + // 转换为BigNumber(使用字符串构造避免精度问题) + const bigNum1 = new BigNumber(num1.toString()); + const bigNum2 = new BigNumber(num2.toString()); + + // 1. 乘法计算 + const product = bigNum1.multipliedBy(bigNum2); + + // 2. 截断到两位小数(不四舍五入) + const truncated = product.decimalPlaces(2, BigNumber.ROUND_DOWN); + + // 3. 格式化保留两位小数(补零) + return truncated.toFixed(2); + } catch (error) { + console.error('计算错误:', error); + return '0.00'; // 出错时返回默认值 + } +}; \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index cd81300..93b6096 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,13 +1,7 @@