use Message instead of Toast

This commit is contained in:
Timi
2026-08-22 01:08:23 +08:00
parent 94c17e6d81
commit e2af521996
46 changed files with 291 additions and 289 deletions
+6 -6
View File
@@ -52,7 +52,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import TagAPI from "@/api/TagAPI";
import type { Tag } from "@/types/Tag";
@@ -136,7 +136,7 @@ async function loadTags(): Promise<void> {
});
tagList.value = result.list || [];
} catch {
Toast.error("标签加载失败");
Message.error("标签加载失败");
} finally {
isLoading.value = false;
}
@@ -145,11 +145,11 @@ async function loadTags(): Promise<void> {
async function createTag(): Promise<void> {
const name = newTagName.value.trim();
if (!name) {
Toast.warning("请输入标签名称");
Message.warning("请输入标签名称");
return;
}
if (tagList.value.some(item => getTagName(item) === name)) {
Toast.warning("标签已存在");
Message.warning("标签已存在");
return;
}
isCreating.value = true;
@@ -163,9 +163,9 @@ async function createTag(): Promise<void> {
if (tag.id) {
draftSelectedIdList.value = [...draftSelectedIdList.value, tag.id];
}
Toast.success("标签已新增");
Message.success("标签已新增");
} catch {
Toast.error("标签新增失败");
Message.error("标签新增失败");
} finally {
isCreating.value = false;
}
+7 -15
View File
@@ -1,8 +1,8 @@
import {createApp} from "vue";
import {createPinia} from "pinia";
import { createApp } from "vue";
import { createPinia } from "pinia";
import router from "@/router";
import Root from "@/Root.vue";
import {useCurrentStoreStore} from "@/store/currentStoreStore";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import "tdesign-mobile-vue/es/style/index.css";
import "timi-web/style.css";
@@ -10,8 +10,8 @@ import "timi-tdesign-mobile/style.css";
import "vue-virtual-scroller/dist/vue-virtual-scroller.css";
import "@/styles/tdesign-custom.css";
import "@/styles/global.less";
import {configureUserStore, type ApiResponse, Network, useUserStore, VCan, VRole} from "timi-web";
import {Toast} from "tdesign-mobile-vue";
import { type ApiResponse, configureUserStore, Network, useUserStore, VCan, VRole } from "timi-web";
import { Message } from "@/utils/message";
export const pinia = createPinia();
const apiBaseURL = import.meta.env.VITE_API_BASE_URL as string | undefined;
@@ -55,11 +55,7 @@ async function bootstrap(): Promise<void> {
}
Network.setGlobalErrorCallback((resp: ApiResponse<any>) => {
Toast({
theme: "error",
direction: "row",
message: resp.message
});
Message.error(resp.message);
});
app.use(router);
@@ -71,11 +67,7 @@ async function start(): Promise<void> {
await bootstrap();
} catch (error) {
console.error(error);
Toast({
theme: "error",
direction: "row",
message: "应用启动失败"
});
Message.error("应用启动失败");
}
}
+4 -4
View File
@@ -143,7 +143,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { AttachmentAPI, PassTimeLabel, Text, useUserStore } from "timi-web";
import CustomerAPI from "@/api/CustomerAPI";
import PointAPI from "@/api/PointAPI";
@@ -264,7 +264,7 @@ async function loadCustomer(): Promise<void> {
customerTagList.value = [];
selectedTagIdList.value = [];
console.warn("客户详情加载失败", err);
Toast.warning("客户详情加载失败");
Message.warning("客户详情加载失败");
}
}
@@ -306,7 +306,7 @@ async function handleTagSelected(tagList: Tag[]): Promise<void> {
});
customerTagList.value = tagList;
selectedTagIdList.value = tagList.map(item => item.id || "").filter(Boolean);
Toast.success("客户标签已保存");
Message.success("客户标签已保存");
}
const inviter = computed(() => customer.value?.introducerCustomer);
@@ -346,7 +346,7 @@ async function removeCustomer(id: string): Promise<void> {
isRemoving.value = true;
try {
await CustomerAPI.remove(id);
Toast.success("客户已删除");
Message.success("客户已删除");
await router.replace("/management/customers");
} finally {
isRemoving.value = false;
+9 -9
View File
@@ -172,7 +172,7 @@
<script setup lang="ts">
import { type Attachment, AttachmentAPI, useUserStore } from "timi-web";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import CustomerAPI from "@/api/CustomerAPI";
import TagAPI from "@/api/TagAPI";
import BodyAreaSelector from "@/components/BodyAreaSelector.vue";
@@ -266,7 +266,7 @@ async function applyIntroducer(code: string): Promise<void> {
formData.introducerCustomer = undefined;
introducerCustomerId.value = "";
scannerVisible.value = false;
Toast.warning(`未匹配到 ${code} 编码介绍人,请选择或扫码已有客户`);
Message.warning(`未匹配到 ${code} 编码介绍人,请选择或扫码已有客户`);
return;
}
formData.introducerCustomerId = matched.id;
@@ -394,7 +394,7 @@ async function loadDetail() {
introducerCustomerId.value = customer.introducerCustomerId || customer.introducerCustomer?.id || "";
} catch (err) {
console.warn("客户详情加载失败", err);
Toast.error("客户详情加载失败");
Message.error("客户详情加载失败");
}
}
onMounted(loadDetail);
@@ -480,11 +480,11 @@ function validateCustomerPhotoList(): boolean {
const attachTypeSet = new Set(photoItemList.value.map(item => item.attachType));
if (!attachTypeSet.has("PHOTO")) {
Toast.warning("请上传客户照片");
Message.warning("请上传客户照片");
return false;
}
if (!attachTypeSet.has("POINT_CARD")) {
Toast.warning("请上传积分卡照片");
Message.warning("请上传积分卡照片");
return false;
}
return true;
@@ -523,10 +523,10 @@ async function doSubmit(): Promise<void> {
}
if (!canSubmit.value) {
if (!formData.name?.trim()) {
Toast.warning("请填写姓名");
Message.warning("请填写姓名");
return;
}
Toast.warning("当前门店未设置");
Message.warning("当前门店未设置");
return;
}
if (!validateCustomerPhotoList()) {
@@ -552,13 +552,13 @@ async function doSubmit(): Promise<void> {
if (isCreateMode.value) {
await CustomerAPI.create(payload);
Toast.success("创建成功");
Message.success("创建成功");
const redirect = String(route.query.redirect || "");
await router.replace(redirect || "/management/customers");
return;
} else {
await CustomerAPI.update(payload);
Toast.success("保存成功");
Message.success("保存成功");
const redirect = String(route.query.redirect || "");
if (redirect) {
await router.replace(redirect);
+7 -7
View File
@@ -97,7 +97,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import CustomerAPI from "@/api/CustomerAPI";
import CodeScanner from "@/components/CodeScanner.vue";
@@ -147,7 +147,7 @@ async function loadCustomer(): Promise<void> {
customer.value = undefined;
invitees.value = [];
console.warn("邀请客户加载失败", err);
Toast.warning("邀请客户加载失败");
Message.warning("邀请客户加载失败");
} finally {
isLoading.value = false;
}
@@ -202,7 +202,7 @@ function handleScanStatusChange(value: string): void {
async function confirmScannedInvitee(): Promise<void> {
if (!pendingInvitee.value) {
Toast.warning("请先扫码识别客户");
Message.warning("请先扫码识别客户");
return;
}
if (await addInvitee(pendingInvitee.value)) {
@@ -224,17 +224,17 @@ async function addInvitee(invitee: Customer): Promise<boolean> {
return false;
}
if (invitee.id === customer.value.id) {
Toast.warning("不能把客户本人添加为邀请客户");
Message.warning("不能把客户本人添加为邀请客户");
return false;
}
if (isCustomerAncestor(invitee)) {
Toast.warning("不能把上级邀请人添加为邀请客户");
Message.warning("不能把上级邀请人添加为邀请客户");
return false;
}
await CustomerAPI.saveInvite(customer.value.id, invitee.id);
await loadInvitees();
Toast.success(`已添加 ${invitee.name || invitee.code}`);
Message.success(`已添加 ${invitee.name || invitee.code}`);
return true;
}
@@ -258,7 +258,7 @@ async function removeInvitee(item: Customer): Promise<void> {
await CustomerAPI.deleteInvite(item.id);
await loadInvitees();
Toast.success("已删除邀请关系");
Message.success("已删除邀请关系");
}
// ---------- 导航 ----------
+2 -2
View File
@@ -98,7 +98,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { type Page, type PageResult, Time, Toolkit, useUserStore } from "timi-web";
import CustomerAPI from "@/api/CustomerAPI";
import GenderIcon from "@/components/GenderIcon.vue";
@@ -236,7 +236,7 @@ async function doExport(): Promise<void> {
try {
const blob = await CustomerAPI.exportXSSF(page);
Toolkit.downloadBlob(blob, `客户列表-${Time.formatDate(new Date())}.xlsx`);
Toast.success("导出已开始");
Message.success("导出已开始");
} finally {
isExporting.value = false;
}
+3 -12
View File
@@ -63,13 +63,8 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import {
calculateQrCodeGrid,
downloadQrCodeImages,
printQrCodeImages,
splitQrCodePages
} from "@/utils/qrCode";
import { Message } from "@/utils/message";
import { calculateQrCodeGrid, downloadQrCodeImages, printQrCodeImages, splitQrCodePages } from "@/utils/qrCode";
import { permissionCodes } from "@/utils/permission";
defineOptions({
@@ -220,11 +215,7 @@ async function printQrCode(): Promise<void> {
title: `${finalStartCode.value}-${finalEndCode.value}`
});
} catch (err) {
Toast({
theme: "warning",
direction: "row",
message: err instanceof Error ? err.message : "打印失败"
});
Message.warning(err instanceof Error ? err.message : "打印失败");
} finally {
printing.value = false;
}
+15 -15
View File
@@ -219,15 +219,15 @@
</template>
<script setup lang="ts">
import { RoleAPI, Time, type ModuleCode } from "timi-web";
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { type ModuleCode, type Role, RoleAPI, Time, useUserStore } from "timi-web";
import type { ColorObject } from "tdesign-mobile-vue";
import { useUserStore, type Role } from "timi-web";
import { DialogPlugin } from "tdesign-mobile-vue";
import EventAPI from "@/api/EventAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import type { EventItem, EventStatus, EventLimitType, EventValueType, EventValueUnit } from "@/types/EventItem";
import type { EventItem, EventLimitType, EventStatus, EventValueType, EventValueUnit } from "@/types/EventItem";
import { getErrorMessage } from "@/utils/error";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message";
type PickerValue = string | number;
@@ -301,7 +301,7 @@ function openStorePicker(): void {
return;
}
if (!currentStoreStore.storeList.length) {
Toast.warning("暂无可选门店");
Message.warning("暂无可选门店");
return;
}
@@ -563,25 +563,25 @@ function resolveTimestamp(valueText: string): number | undefined {
function validateForm(): boolean {
if (!formModel.storeId) {
Toast.warning("请选择门店");
Message.warning("请选择门店");
return false;
}
if (!formModel.name.trim()) {
Toast.warning("请输入登记事件名称");
Message.warning("请输入登记事件名称");
return false;
}
if (!formModel.roleCodeList.length) {
Toast.warning("请至少选择一个可登记角色");
Message.warning("请至少选择一个可登记角色");
return false;
}
if (isValueLimitType(formModel.limitType) && !resolveLimitValue()) {
Toast.warning("请输入有效的约束数值");
Message.warning("请输入有效的约束数值");
return false;
}
const beginAt = resolveTimestamp(formModel.beginAtText);
const endAt = resolveTimestamp(formModel.endAtText);
if (beginAt !== undefined && endAt !== undefined && endAt < beginAt) {
Toast.warning("终止时间不能早于起始时间");
Message.warning("终止时间不能早于起始时间");
return false;
}
return true;
@@ -651,10 +651,10 @@ async function saveEventItem(): Promise<void> {
} else {
await EventAPI.update(payload);
}
Toast.success("登记事件已保存");
Message.success("登记事件已保存");
await router.replace("/management/registration-events");
} catch (error) {
Toast.error(getErrorMessage(error, "登记事件保存失败"));
Message.error(getErrorMessage(error, "登记事件保存失败"));
} finally {
isSaving.value = false;
}
@@ -690,10 +690,10 @@ async function removeEventItem(id: string): Promise<void> {
isRemoving.value = true;
try {
await EventAPI.remove(id);
Toast.success("登记事件已删除");
Message.success("登记事件已删除");
await router.replace("/management/registration-events");
} catch {
Toast.error("登记事件删除失败");
Message.error("登记事件删除失败");
} finally {
isRemoving.value = false;
}
@@ -746,7 +746,7 @@ onMounted(async () => {
try {
await fillForm();
} catch {
Toast.error("登记事件加载失败");
Message.error("登记事件加载失败");
}
});
</script>
+2 -2
View File
@@ -63,7 +63,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { type Page, type PageResult, type Role, useUserStore } from "timi-web";
import EventAPI from "@/api/EventAPI";
import ManagedUserAPI from "@/api/ManagedUserAPI";
@@ -259,7 +259,7 @@ onMounted(async () => {
try {
await loadData();
} catch {
Toast.error("登记事件加载失败");
Message.error("登记事件加载失败");
}
});
+10 -10
View File
@@ -184,7 +184,7 @@
<script setup lang="ts">
import { AttachmentAPI, Time, type Attachment, useUserStore } from "timi-web";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import CustomerAPI from "@/api/CustomerAPI";
import EventAPI from "@/api/EventAPI";
import EventRecordAPI from "@/api/EventRecordAPI";
@@ -438,18 +438,18 @@ function validateNumberValueList(): boolean {
const valueText = numberValueTextMap[eventId] || "";
if (event.valueType !== "NUMBER") {
if (valueText.trim()) {
Toast.warning(`${event.name || "当前事件"}不能提交数值`);
Message.warning(`${event.name || "当前事件"}不能提交数值`);
return false;
}
continue;
}
const numberValue = resolveNumberValue(eventId);
if (valueText.trim() && numberValue === undefined) {
Toast.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
Message.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
return false;
}
if (event.requireValue && numberValue === undefined) {
Toast.warning(`请填写${event.name || "当前事件"}数值`);
Message.warning(`请填写${event.name || "当前事件"}数值`);
return false;
}
}
@@ -630,7 +630,7 @@ async function submitRecord(): Promise<void> {
}
await loadRecentRecordList();
await settingStore.playRegisterSuccessSound();
Toast.success("登记已提交");
Message.success("登记已提交");
await router.replace("/customers");
} finally {
isSaving.value = false;
@@ -639,11 +639,11 @@ async function submitRecord(): Promise<void> {
function validateForm(): boolean {
if (!selectedCustomerList.value.some(item => !!item.id)) {
Toast.warning("请先选择或扫码客户");
Message.warning("请先选择或扫码客户");
return false;
}
if (!selectedEventIdList.value.length) {
Toast.warning("请至少选择一个登记事件");
Message.warning("请至少选择一个登记事件");
return false;
}
if (!isEditMode.value && !validateNumberValueList()) {
@@ -653,7 +653,7 @@ function validateForm(): boolean {
const pointValue = resolveSourceValue();
const range = sourceValueConfig.value?.range;
if (!pointValue || !range || Math.abs(pointValue) < range[0] || range[1] < Math.abs(pointValue)) {
Toast.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
Message.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
return false;
}
}
@@ -663,7 +663,7 @@ function validateForm(): boolean {
async function updateRecord(): Promise<void> {
if (!editingRecord.value?.id || !editingRecord.value.customerId || !editingRecord.value.eventId) {
Toast.warning("登记事件记录不存在");
Message.warning("登记事件记录不存在");
return;
}
@@ -675,7 +675,7 @@ async function updateRecord(): Promise<void> {
registeredAt: editingRecord.value.registeredAt,
attachmentList: buildPhotoAttachmentList()
});
Toast.success("记录已保存");
Message.success("记录已保存");
await router.replace(`/management/registration-event-records/${editingRecord.value.id}`);
}
+7 -6
View File
@@ -132,17 +132,18 @@
</template>
<script setup lang="ts">
import { DialogPlugin, Toast, type DropdownValue } from "tdesign-mobile-vue";
import { DialogPlugin, type DropdownValue } from "tdesign-mobile-vue";
import { Time, Toolkit, useUserStore } from "timi-web";
import EventAPI from "@/api/EventAPI";
import EventRecordAPI from "@/api/EventRecordAPI";
import { useNavBarStore } from "@/store/navBarStore";
import type { EventItem } from "@/types/EventItem";
import type { EventRecordPage, EventRecordPageResult, EventRecordListItemView } from "@/types/EventRecord";
import type { EventRecordListItemView, EventRecordPage, EventRecordPageResult } from "@/types/EventRecord";
import { getCustomerPhotoURL } from "@/utils/customer";
import { getErrorMessage } from "@/utils/error";
import { formatEventNumberValue } from "@/utils/eventValue";
import { permissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message.ts";
type DateFilterType = "today" | "yesterday" | "beforeYesterday" | "lastWeek" | "all" | "custom";
@@ -368,7 +369,7 @@ async function exportExcel(): Promise<void> {
...buildRangeReq()
});
Toolkit.downloadBlob(blob, `登记事件记录-${Time.formatDate(new Date())}.xlsx`);
Toast.success("导出已开始");
Message.success("导出已开始");
} finally {
isExporting.value = false;
}
@@ -424,14 +425,14 @@ async function removeRecord(id: string): Promise<void> {
try {
await EventRecordAPI.remove(id);
await reloadRecords();
Toast.success("登记记录已删除");
Message.success("登记记录已删除");
} catch (error) {
const message = getErrorMessage(error, "登记记录删除失败");
if (message.includes("积分余额不足") || message.includes("余额不足")) {
Toast.warning("积分余额不足,请先人工调整积分后再删除登记记录");
Message.warning("积分余额不足,请先人工调整积分后再删除登记记录");
return;
}
Toast.error(message);
Message.error(message);
} finally {
isDeleting.value = false;
deletingId.value = "";
+5 -4
View File
@@ -139,8 +139,8 @@
</template>
<script setup lang="ts">
import { Toast, type DropdownValue } from "tdesign-mobile-vue";
import { Time, type PageResult } from "timi-web";
import { type DropdownValue } from "tdesign-mobile-vue";
import { type PageResult, Time } from "timi-web";
import EventAPI from "@/api/EventAPI";
import EventRecordAPI from "@/api/EventRecordAPI";
import type { CustomerEventRankView, EventRecordRankPage, EventRecordRankType } from "@/types/EventRecord";
@@ -149,6 +149,7 @@ import { getCustomerPhotoURL } from "@/utils/customer";
import { getErrorMessage } from "@/utils/error";
import { formatEventNumberValue } from "@/utils/eventValue";
import { permissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message.ts";
type DateFilterType = "all" | "today" | "yesterday" | "lastWeek" | "thisMonth" | "custom";
@@ -314,7 +315,7 @@ async function loadRanks(): Promise<void> {
page.index += 1;
isNoMore.value = pageResult.total <= pageResult.list.length || (result.list || []).length < page.size;
} catch (error) {
Toast.error(getErrorMessage(error, "登记记录排行加载失败"));
Message.error(getErrorMessage(error, "登记记录排行加载失败"));
} finally {
if (token === loadToken) {
isLoading.value = false;
@@ -342,7 +343,7 @@ async function selectRankType(value: DropdownValue): Promise<void> {
const filterChanged = normalizeEventFilter();
await replaceFilterQuery();
if (!canLoadRank.value) {
Toast.warning(rankType.value === "TOTAL_NUMBER_VALUE" ? "数值排行需要选择单个有数值事件" : "连续排行需要选择单个登记事件");
Message.warning(rankType.value === "TOTAL_NUMBER_VALUE" ? "数值排行需要选择单个有数值事件" : "连续排行需要选择单个登记事件");
}
if (!filterChanged) {
await reloadRanks();
+6 -5
View File
@@ -48,12 +48,13 @@
</template>
<script setup lang="ts">
import { Toast, type TagProps } from "tdesign-mobile-vue";
import { type TagProps } from "tdesign-mobile-vue";
import { VueDraggableNext } from "vue-draggable-next";
import EventAPI from "@/api/EventAPI";
import { useNavBarStore } from "@/store/navBarStore";
import type { EventItem, EventStatus } from "@/types/EventItem";
import { permissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message.ts";
defineOptions({
name: "EventSort"
@@ -115,10 +116,10 @@ async function saveSort(): Promise<void> {
item.sort = index;
});
sortDirty.value = false;
Toast.success("登记事件排序已保存");
await router.back();
Message.success("登记事件排序已保存");
router.back();
} catch {
Toast.error("登记事件排序保存失败");
Message.error("登记事件排序保存失败");
} finally {
isSaving.value = false;
}
@@ -150,7 +151,7 @@ onMounted(async () => {
try {
await loadData();
} catch {
Toast.error("登记事件加载失败");
Message.error("登记事件加载失败");
}
});
+12 -20
View File
@@ -140,7 +140,7 @@
<script setup lang="ts">
import { AttachmentAPI, Toolkit, useUserStore, type Attachment } from "timi-web";
import type { TdInputProps } from "tdesign-mobile-vue";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import CustomerAPI from "@/api/CustomerAPI";
import EventAPI from "@/api/EventAPI";
import CodeScanner from "@/components/CodeScanner.vue";
@@ -227,18 +227,18 @@ function validateNumberValueList(): boolean {
const valueText = numberValueTextMap[eventId] || "";
if (event.valueType !== "NUMBER") {
if (valueText.trim()) {
showToast(`${event.name || "当前事件"}不能提交数值`, "warning");
Message.warning(`${event.name || "当前事件"}不能提交数值`);
return false;
}
continue;
}
const numberValue = resolveNumberValue(eventId);
if (valueText.trim() && numberValue === undefined) {
showToast(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`, "warning");
Message.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
return false;
}
if (event.requireValue && numberValue === undefined) {
showToast(`请填写${event.name || "当前事件"}数值`, "warning");
Message.warning(`请填写${event.name || "当前事件"}数值`);
return false;
}
}
@@ -549,11 +549,11 @@ function validateCustomerPhotoList(): boolean {
const attachTypeSet = new Set(customerPhotoItemList.value.map(item => item.attachType));
if (!attachTypeSet.has("PHOTO")) {
showToast("请上传客户照片", "warning");
Message.warning("请上传客户照片");
return false;
}
if (!attachTypeSet.has("POINT_CARD")) {
showToast("请上传积分卡照片", "warning");
Message.warning("请上传积分卡照片");
return false;
}
return true;
@@ -570,7 +570,7 @@ async function handleCustomerPhotoSelected(event: Event): Promise<void> {
const compressedFile = await compressUploadImage(file);
const [tempFile] = await AttachmentAPI.upload(compressedFile);
if (!tempFile?.id) {
showToast("客户照片上传失败", "warning");
Message.warning("客户照片上传失败");
return;
}
customerPhotoItemList.value.push({
@@ -635,7 +635,7 @@ async function saveRecord(): Promise<void> {
return;
}
if (customerPhotoUploading.value || recordPhotoUploading.value) {
showToast("照片正在上传,请稍候", "warning");
Message.warning("照片正在上传,请稍候");
return;
}
const customerCode = validateForm();
@@ -674,7 +674,7 @@ async function saveRecord(): Promise<void> {
await EventRecordAPI.createWithCustomer(customer);
resetFormAfterSubmit();
await settingStore.playRegisterSuccessSound();
showToast("登记已提交");
Message.success("登记已提交");
await router.replace("/customers");
} finally {
saving.value = false;
@@ -724,11 +724,11 @@ function buildCustomerAttachmentList(): Attachment[] {
function validateForm(): string {
const customerCode = (currentCode.value || scanCode.value).trim();
if (!customerCode) {
showToast("请先输入或扫码客户编码", "warning");
Message.warning("请先输入或扫码客户编码");
return "";
}
if (!customerName.value.trim()) {
showToast("请填写客户姓名", "warning");
Message.warning("请填写客户姓名");
return "";
}
if (!validateCustomerPhotoList()) {
@@ -741,21 +741,13 @@ function validateForm(): string {
const pointValue = resolveSourceValue();
const range = sourceValueConfig.value?.range;
if (!pointValue || !range || Math.abs(pointValue) < range[0] || range[1] < Math.abs(pointValue)) {
showToast(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`, "warning");
Message.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
return "";
}
}
return customerCode;
}
function showToast(message: string, theme: "success" | "warning" = "success"): void {
Toast({
theme,
direction: "row",
message
});
}
// ---------- 初始化 ----------
onMounted(async () => {
+5 -5
View File
@@ -89,7 +89,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import CustomerAPI from "@/api/CustomerAPI";
import EventAPI from "@/api/EventAPI";
import EventRecordAPI from "@/api/EventRecordAPI";
@@ -143,7 +143,7 @@ async function selectEvent(eventId?: string): Promise<void> {
Storage.setString(EventItemStorageKey, selectedEventId);
eventSelectorVisible.value = false;
await loadSourceValueRule();
Toast.success("登记事件已切换");
Message.success("登记事件已切换");
}
onMounted(loadActions);
@@ -251,16 +251,16 @@ async function doSubmit(): Promise<void> {
const pointValue = resolveSourceValue();
const numberValue = resolveNumberValue();
if (showNumberValueInput.value && numberValueText.value.trim() && numberValue === undefined) {
Toast.warning("事件数值格式不正确,请检查单位和小数位");
Message.warning("事件数值格式不正确,请检查单位和小数位");
return;
}
if (selectedEvent.value?.requireValue && numberValue === undefined) {
Toast.warning("请填写事件数值");
Message.warning("请填写事件数值");
return;
}
const range = sourceValueConfig.value?.range;
if (showSourceValueInput.value && (!pointValue || !range || Math.abs(pointValue) < range[0] || range[1] < Math.abs(pointValue))) {
Toast.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
Message.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
return;
}
submitting.value = true;
+5 -4
View File
@@ -19,10 +19,11 @@
<script setup lang="ts">
import { NotifyAPI, type NotifyDetail, PassTimeLabel } from "timi-web";
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { DialogPlugin } from "tdesign-mobile-vue";
import { useNavBarStore } from "@/store/navBarStore";
import { getErrorMessage } from "@/utils/error";
import { corePermissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message.ts";
const route = useRoute();
const router = useRouter();
@@ -62,7 +63,7 @@ async function loadDetail(): Promise<void> {
await markRead(result, requestToken);
} catch (error) {
console.warn("通知详情加载失败", error);
Toast.error("通知详情加载失败");
Message.error("通知详情加载失败");
} finally {
if (requestToken === loadToken) {
isLoading.value = false;
@@ -106,10 +107,10 @@ async function deleteDetail(detailId: string): Promise<void> {
navBarStore.clearRight();
try {
await NotifyAPI.deleteInternal(detailId);
Toast.success("通知已删除");
Message.success("通知已删除");
await router.replace({ name: "NotifyList" });
} catch (error) {
Toast.error(getErrorMessage(error, "通知删除失败"));
Message.error(getErrorMessage(error, "通知删除失败"));
setDeleteAction();
} finally {
isDeleting.value = false;
+7 -6
View File
@@ -66,7 +66,8 @@
<script setup lang="ts">
import { NotifyAPI, Time, type NotifyDetail, type Page, type PageResult, useUserStore } from "timi-web";
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { DialogPlugin } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useNavBarStore } from "@/store/navBarStore";
import { getErrorMessage } from "@/utils/error";
import { corePermissionCodes } from "@/utils/permission";
@@ -220,10 +221,10 @@ async function markAllRead(): Promise<void> {
await NotifyAPI.markAllInternalRead();
unreadCount.value = 0;
await reloadList();
Toast.success("已全部标记为已读");
Message.success("已全部标记为已读");
} catch (error) {
console.warn("全部通知标记已读失败", error);
Toast.error("全部标记已读失败");
Message.error("全部标记已读失败");
} finally {
isMarkingAllRead.value = false;
updateNavBarAction();
@@ -261,9 +262,9 @@ async function deleteNotification(detailId: string): Promise<void> {
await NotifyAPI.deleteInternal(detailId);
await reloadList();
await loadUnreadCount();
Toast.success("通知已删除");
Message.success("通知已删除");
} catch (error) {
Toast.error(getErrorMessage(error, "通知删除失败"));
Message.error(getErrorMessage(error, "通知删除失败"));
} finally {
deletingId.value = "";
}
@@ -320,7 +321,7 @@ onMounted(async () => {
await loadUnreadCount();
} catch (error) {
console.warn("站内通知加载失败", error);
Toast.error("站内通知加载失败");
Message.error("站内通知加载失败");
}
});
+2 -2
View File
@@ -19,7 +19,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { moduleCode, usePermissionSettingsStore } from "@/store/permissionSettingsStore";
import { corePermissionCodes } from "@/utils/permission";
@@ -75,7 +75,7 @@ async function savePermission(): Promise<void> {
name: formModel.name,
description: formModel.description
}, isCreateMode.value);
Toast.success("权限已保存");
Message.success("权限已保存");
await router.push(isCreateMode.value ? "/management/permissions/items" : `/management/permissions/items/${permission?.id || formModel.id}`);
}
@@ -42,7 +42,7 @@
<script setup lang="ts">
import type { DropdownOption, DropdownValue } from "tdesign-mobile-vue";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { type Permission, useUserStore } from "timi-web";
import { useNavBarStore } from "@/store/navBarStore";
import { type Role, usePermissionSettingsStore } from "@/store/permissionSettingsStore";
@@ -131,7 +131,7 @@ async function savePermissionList(): Promise<void> {
...checkedPermissionIds.value,
...unmanagedPermissionIds.value
])));
Toast.success("D 已保存");
Message.success("D 已保存");
await loadActiveRolePermissions();
} catch (error) {
clearPermissionState();
@@ -139,7 +139,7 @@ async function savePermissionList(): Promise<void> {
await loadAuthorizationScope();
await loadActiveRolePermissions();
} finally {
Toast.error(getErrorMessage(error, "D 保存失败"));
Message.error(getErrorMessage(error, "D 保存失败"));
}
}
}
+7 -7
View File
@@ -101,7 +101,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import { useNavBarStore } from "@/store/navBarStore";
@@ -233,7 +233,7 @@ function openParentRolePicker(): void {
return;
}
if (!parentRoleOptions.value.length) {
Toast.warning("暂无可选上级");
Message.warning("暂无可选上级");
return;
}
parentRolePickerDraft.value = [formModel.parentRoleId];
@@ -387,7 +387,7 @@ async function saveBaseInfo(): Promise<void> {
savingTarget.value = "base";
try {
if (isCreateMode.value && !formModel.parentRoleId) {
Toast.warning("请选择管理父级");
Message.warning("请选择管理父级");
return;
}
@@ -406,11 +406,11 @@ async function saveBaseInfo(): Promise<void> {
if (!isCreateMode.value && formModel.parentRoleId !== currentRole.value?.parentRoleId) {
await permissionStore.setRoleParentRole(formModel.id, formModel.parentRoleId);
}
Toast.success(isCreateMode.value ? "角色已创建" : "基础信息已保存");
Message.success(isCreateMode.value ? "角色已创建" : "基础信息已保存");
await router.push(`/management/permissions/roles/${role?.id || formModel.id}`);
} catch (error) {
await reloadAfterError();
Toast.error(getErrorMessage(error, "角色保存失败"));
Message.error(getErrorMessage(error, "角色保存失败"));
} finally {
savingTarget.value = "";
}
@@ -427,12 +427,12 @@ async function saveRoleInherit(): Promise<void> {
await permissionStore.setRoleChildRoleList(formModel.id, childRoleIdList);
formModel.childRoleIdList = childRoleIdList;
childRolePickerVisible.value = false;
Toast.success("继承关系已保存");
Message.success("继承关系已保存");
await reloadCurrentRole();
} catch (error) {
await reloadAfterError();
childRolePickerDraft.value = [...formModel.childRoleIdList];
Toast.error(getErrorMessage(error, "继承关系保存失败"));
Message.error(getErrorMessage(error, "继承关系保存失败"));
} finally {
savingTarget.value = "";
}
+2 -2
View File
@@ -34,7 +34,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import type { Role } from "@/store/permissionSettingsStore";
import { useNavBarStore } from "@/store/navBarStore";
@@ -81,7 +81,7 @@ async function removeRole(id: string): Promise<void> {
} catch (error) {
await refreshAuthorizationScope();
await permissionStore.loadAll(true);
Toast.error(getErrorMessage(error, "角色删除失败"));
Message.error(getErrorMessage(error, "角色删除失败"));
}
}
@@ -46,7 +46,7 @@
<script setup lang="ts">
import type { DropdownOption, DropdownValue } from "tdesign-mobile-vue";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { type Permission, useUserStore } from "timi-web";
import { useNavBarStore } from "@/store/navBarStore";
import { type Role, usePermissionSettingsStore } from "@/store/permissionSettingsStore";
@@ -141,7 +141,7 @@ async function savePermissionList(): Promise<void> {
...checkedPermissionIds.value,
...unmanagedPermissionIds.value
])));
Toast.success("已保存");
Message.success("已保存");
await loadActiveRolePermissions();
} catch (error) {
clearPermissionState();
@@ -149,7 +149,7 @@ async function savePermissionList(): Promise<void> {
await loadAuthorizationScope();
await loadActiveRolePermissions();
} finally {
Toast.error(getErrorMessage(error, "保存失败"));
Message.error(getErrorMessage(error, "保存失败"));
}
}
}
+4 -4
View File
@@ -86,7 +86,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import CustomerAPI from "@/api/CustomerAPI";
import PointAPI from "@/api/PointAPI";
@@ -149,7 +149,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
try {
const matched = await CustomerAPI.findByCode(normalizedCode);
if (!matched?.id) {
Toast.warning("未找到客户");
Message.warning("未找到客户");
return;
}
selectedCustomerId.value = matched.id;
@@ -160,7 +160,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
});
await loadAccount();
} catch {
Toast.error("客户信息加载失败");
Message.error("客户信息加载失败");
}
}
@@ -183,7 +183,7 @@ async function loadAccount(): Promise<void> {
} catch {
customer.value = undefined;
account.value = undefined;
Toast.error("客户信息加载失败");
Message.error("客户信息加载失败");
} finally {
isLoading.value = false;
}
+12 -12
View File
@@ -81,7 +81,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import type { PointAction } from "@/types/Point";
import CustomerAPI from "@/api/CustomerAPI";
@@ -141,7 +141,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
try {
const matched = await CustomerAPI.findByCode(normalizedCode);
if (!matched?.id) {
Toast.warning("未找到客户");
Message.warning("未找到客户");
return;
}
selectedCustomerId.value = matched.id;
@@ -150,7 +150,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
} catch {
selectedCustomer.value = undefined;
account.value = undefined;
Toast.error("客户信息加载失败");
Message.error("客户信息加载失败");
}
}
@@ -173,7 +173,7 @@ async function loadCustomerAccount(): Promise<void> {
} catch {
selectedCustomer.value = undefined;
account.value = undefined;
Toast.error("客户信息加载失败");
Message.error("客户信息加载失败");
}
}
@@ -243,23 +243,23 @@ function confirmPointActionPicker(value: Array<string | number>): void {
async function submitAdjust(): Promise<void> {
const pointDelta = parsePointDelta();
if (!selectedCustomerId.value) {
Toast.warning("请选择客户");
Message.warning("请选择客户");
return;
}
if (!currentStoreStore.currentStoreId) {
Toast.warning("当前门店未设置");
Message.warning("当前门店未设置");
return;
}
if (!pointDelta) {
Toast.warning("调整积分不能为 0,且必须是整数");
Message.warning("调整积分不能为 0,且必须是整数");
return;
}
if (!remark.value.trim()) {
Toast.warning("请填写调整原因");
Message.warning("请填写调整原因");
return;
}
if (pointDelta < 0 && Math.abs(pointDelta) > (account.value?.balance ?? 0)) {
Toast.warning("扣分后余额不能小于 0");
Message.warning("扣分后余额不能小于 0");
return;
}
@@ -272,13 +272,13 @@ async function submitAdjust(): Promise<void> {
pointDelta,
remark: remark.value.trim()
});
Toast.success("积分调整已提交");
Message.success("积分调整已提交");
await router.replace({
name: "PointLedgerList",
query: { customerId: selectedCustomerId.value }
});
} catch (error) {
Toast.error(getErrorMessage(error, "积分调整失败"));
Message.error(getErrorMessage(error, "积分调整失败"));
} finally {
isSaving.value = false;
}
@@ -293,7 +293,7 @@ onMounted(async () => {
await prepareStoreScope();
await loadCustomerAccount();
} catch (error) {
Toast.error(getErrorMessage(error, "门店信息加载失败"));
Message.error(getErrorMessage(error, "门店信息加载失败"));
}
});
</script>
+6 -5
View File
@@ -154,7 +154,7 @@
</template>
<script setup lang="ts">
import { Toast, type DropdownValue } from "tdesign-mobile-vue";
import type { DropdownValue } from "tdesign-mobile-vue";
import { Time, type PageResult, useUserStore } from "timi-web";
import CustomerAPI from "@/api/CustomerAPI";
import PointAPI from "@/api/PointAPI";
@@ -165,6 +165,7 @@ import { useSettingStore } from "@/store/settingStore";
import type { Customer } from "@/types/Customer";
import type { PointLedger, PointLedgerChangeType, PointLedgerPage } from "@/types/Point";
import { getCustomerPhotoURL } from "@/utils/customer";
import { Message } from "@/utils/message";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
type DateFilter = "all" | "today" | "last7" | "last30" | "custom";
@@ -228,14 +229,14 @@ async function loadCustomerByCode(code: string): Promise<void> {
try {
const matched = await CustomerAPI.findByCode(normalizedCode);
if (!matched?.id) {
Toast.warning("未找到客户");
Message.warning("未找到客户");
return;
}
selectedCustomerId.value = matched.id;
customer.value = matched;
await reload();
} catch {
Toast.error("客户信息加载失败");
Message.error("客户信息加载失败");
}
}
@@ -353,7 +354,7 @@ async function load(): Promise<void> {
page.index += 1;
isNoMore.value = pageResult.list.length >= pageResult.total || list.length < page.size;
} catch {
Toast.error("积分流水加载失败");
Message.error("积分流水加载失败");
} finally {
if (token === loadToken) {
isLoading.value = false;
@@ -492,7 +493,7 @@ onMounted(async () => {
try {
await preparePage();
} catch {
Toast.error("积分流水页面加载失败");
Message.error("积分流水页面加载失败");
}
});
</script>
+42 -27
View File
@@ -189,7 +189,7 @@
</template>
<script setup lang="ts">
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { DialogPlugin } from "tdesign-mobile-vue";
import { Time, useUserStore } from "timi-web";
import EventAPI from "@/api/EventAPI";
import PointAPI from "@/api/PointAPI";
@@ -197,11 +197,26 @@ import PointRuleTierEditor from "@/pages/point/component/PointRuleTierEditor.vue
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import { useNavBarStore } from "@/store/navBarStore";
import type { EventItem } from "@/types/EventItem";
import type { PointAction, PointRule, PointRuleMode, PointRuleStatus, PointRuleTier, PointRuleTierForm, PointRuleTriggerType } from "@/types/Point";
import type {
PointAction,
PointRule,
PointRuleMode,
PointRuleStatus,
PointRuleTier,
PointRuleTierForm,
PointRuleTriggerType
} from "@/types/Point";
import { getEventValueUnitText } from "@/utils/eventValue";
import { getErrorMessage } from "@/utils/error";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
import { formatTierBoundaryValue, getTierMinValue, isLastTier, resolveNonNegativeInteger, resolveTierBoundaryValue } from "@/utils/pointRule";
import {
formatTierBoundaryValue,
getTierMinValue,
isLastTier,
resolveNonNegativeInteger,
resolveTierBoundaryValue
} from "@/utils/pointRule";
import { Message } from "@/utils/message";
type PickerValue = string | number;
@@ -316,7 +331,7 @@ async function confirmStorePicker(value: Array<string | number>): Promise<void>
await loadEventList();
} catch {
eventList.value = [];
Toast.error("登记事件加载失败");
Message.error("登记事件加载失败");
}
}
storePickerVisible.value = false;
@@ -324,7 +339,7 @@ async function confirmStorePicker(value: Array<string | number>): Promise<void>
function openEventPicker(): void {
if (!eventPickerColumns.value[0]?.length) {
Toast.warning("暂无可选登记事件");
Message.warning("暂无可选登记事件");
return;
}
eventPickerDraft.value = [formModel.eventId];
@@ -344,7 +359,7 @@ function openSourceEventPicker(): void {
return;
}
if (!sourceEventPickerColumns.value[0]?.length) {
Toast.warning("暂无可用的 NUMBER 来源事件");
Message.warning("暂无可用的 NUMBER 来源事件");
return;
}
sourceEventPickerDraft.value = [formModel.sourceEventId];
@@ -358,7 +373,7 @@ function confirmSourceEventPicker(value: Array<string | number>): void {
const nextSourceEvent = sourceEventList.value.find(item => item.id === sourceEventId);
if (formModel.sourceEventId && previousSourceEvent?.valueUnit !== nextSourceEvent?.valueUnit) {
formModel.tiers = [createTierForm(undefined, true, nextSourceEvent?.valueUnit)];
Toast.warning("来源事件单位已变化,原分档已清空,请重新配置");
Message.warning("来源事件单位已变化,原分档已清空,请重新配置");
}
formModel.sourceEventId = sourceEventId;
}
@@ -617,36 +632,36 @@ function buildCondition(): PointRule["conditionJson"] {
function validateForm(): boolean {
if (!formModel.storeId) {
Toast.warning("请选择门店");
Message.warning("请选择门店");
return false;
}
if (!formModel.eventId) {
Toast.warning("请选择登记事件");
Message.warning("请选择登记事件");
return false;
}
if (!formModel.name.trim()) {
Toast.warning("请输入规则名称");
Message.warning("请输入规则名称");
return false;
}
if (formModel.triggerType === "CUSTOMER_EVENT_VALUE_TIER") {
if (formModel.pointMode !== "TIER") {
Toast.warning("分档规则必须使用分档积分模式");
Message.warning("分档规则必须使用分档积分模式");
return false;
}
if (!selectedSourceEvent.value) {
Toast.warning("请选择 NUMBER 类型的来源事件");
Message.warning("请选择 NUMBER 类型的来源事件");
return false;
}
if (selectedSourceValueUnit.value !== "CENT" && selectedSourceValueUnit.value !== "COUNT") {
Toast.warning("来源事件必须配置数值单位");
Message.warning("来源事件必须配置数值单位");
return false;
}
if (!resolvePositiveInteger(formModel.windowAmountText)) {
Toast.warning("累计窗口必须是正整数");
Message.warning("累计窗口必须是正整数");
return false;
}
if (!formModel.tiers.length || !(formModel.tiers.length < 100)) {
Toast.warning("分档数量必须是 1-100 档");
Message.warning("分档数量必须是 1-100 档");
return false;
}
for (let i = 0; i < formModel.tiers.length; i++) {
@@ -654,17 +669,17 @@ function validateForm(): boolean {
const min = getTierMinValue(formModel.tiers, i, selectedSourceValueUnit.value);
const pointValue = resolveNonNegativeInteger(tier.pointValueText);
if (min === undefined) {
Toast.warning(`第 ${i + 1} 档的上一档最大值无效`);
Message.warning(`第 ${i + 1} 档的上一档最大值无效`);
return false;
}
if (pointValue === undefined) {
Toast.warning(`第 ${i + 1} 档积分数量必须是大于等于 0 的整数`);
Message.warning(`第 ${i + 1} 档积分数量必须是大于等于 0 的整数`);
return false;
}
if (!isLastTier(formModel.tiers, i)) {
const max = resolveTierBoundaryValue(tier.maxText, selectedSourceValueUnit.value);
if (max === undefined || max < min) {
Toast.warning(selectedSourceValueUnit.value === "CENT"
Message.warning(selectedSourceValueUnit.value === "CENT"
? `第 ${i + 1} 档最大值必须是不小于最小值且最多两位小数`
: `第 ${i + 1} 档最大值必须是不小于最小值的整数`);
return false;
@@ -672,25 +687,25 @@ function validateForm(): boolean {
}
}
} else if (formModel.pointMode === "FIXED" && !resolvePositiveInteger(formModel.pointValueText)) {
Toast.warning("积分数量必须是正整数");
Message.warning("积分数量必须是正整数");
return false;
}
if (formModel.triggerType === "AFTER_COUNT_EVERY_TIME" && !resolvePositiveInteger(formModel.thresholdText)) {
Toast.warning("请输入有效的触发阈值");
Message.warning("请输入有效的触发阈值");
return false;
}
if (formModel.pointMode === "SOURCE_VALUE") {
const min = resolvePositiveInteger(formModel.minText);
const max = resolvePositiveInteger(formModel.maxText);
if (!min || !max || max < min) {
Toast.warning("积分数量范围必须是正整数,且最大值不能小于最小值");
Message.warning("积分数量范围必须是正整数,且最大值不能小于最小值");
return false;
}
}
const beginAt = resolveTimestamp(formModel.beginAtText);
const endAt = resolveTimestamp(formModel.endAtText);
if (beginAt !== undefined && endAt !== undefined && endAt < beginAt) {
Toast.warning("生效结束时间不能早于开始时间");
Message.warning("生效结束时间不能早于开始时间");
return false;
}
return true;
@@ -722,10 +737,10 @@ async function saveRule(): Promise<void> {
} else {
await PointAPI.ruleUpdate(payload);
}
Toast.success("积分规则已保存");
Message.success("积分规则已保存");
await router.replace("/management/points/rules");
} catch (error) {
Toast.error(getErrorMessage(error, "积分规则保存失败"));
Message.error(getErrorMessage(error, "积分规则保存失败"));
} finally {
isSaving.value = false;
}
@@ -759,10 +774,10 @@ async function removeRule(): Promise<void> {
isRemoving.value = true;
try {
await PointAPI.ruleRemove(formModel.id);
Toast.success("积分规则已删除");
Message.success("积分规则已删除");
await router.replace("/management/points/rules");
} catch (error) {
Toast.error(getErrorMessage(error, "积分规则删除失败"));
Message.error(getErrorMessage(error, "积分规则删除失败"));
} finally {
isRemoving.value = false;
}
@@ -817,7 +832,7 @@ onMounted(async () => {
try {
await fillForm();
} catch (error) {
Toast.error(getErrorMessage(error, "积分规则加载失败"));
Message.error(getErrorMessage(error, "积分规则加载失败"));
}
});
+4 -3
View File
@@ -62,7 +62,7 @@
</template>
<script setup lang="ts">
import { type DropdownValue, Toast } from "tdesign-mobile-vue";
import { type DropdownValue } from "tdesign-mobile-vue";
import EventAPI from "@/api/EventAPI";
import PointAPI from "@/api/PointAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
@@ -71,6 +71,7 @@ import type { EventItem } from "@/types/EventItem";
import type { PointRule, PointRuleStatus } from "@/types/Point";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
import { type Page, type PageResult, useUserStore } from "timi-web";
import { Message } from "@/utils/message.ts";
defineOptions({
name: "PointRuleList"
@@ -158,7 +159,7 @@ async function load(): Promise<void> {
page.index += 1;
isNoMore.value = pageResult.list.length >= pageResult.total || list.length < page.size;
} catch {
Toast.error("积分规则加载失败");
Message.error("积分规则加载失败");
} finally {
if (token === loadToken) {
isLoading.value = false;
@@ -274,7 +275,7 @@ onMounted(async () => {
try {
await preparePage();
} catch {
Toast.error("积分规则页面加载失败");
Message.error("积分规则页面加载失败");
}
});
+4 -4
View File
@@ -40,7 +40,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { VueDraggableNext } from "vue-draggable-next";
import EventAPI from "@/api/EventAPI";
import PointAPI from "@/api/PointAPI";
@@ -95,10 +95,10 @@ async function saveSort(): Promise<void> {
await PointAPI.ruleSort(idList);
ruleList.value.forEach((item, index) => { item.priority = index; });
sortDirty.value = false;
Toast.success("积分规则排序已保存");
Message.success("积分规则排序已保存");
await router.back();
} catch {
Toast.error("积分规则排序保存失败");
Message.error("积分规则排序保存失败");
} finally {
isSaving.value = false;
}
@@ -110,7 +110,7 @@ onMounted(async () => {
try {
await loadData();
} catch {
Toast.error("启用积分规则加载失败");
Message.error("启用积分规则加载失败");
}
});
@@ -94,7 +94,7 @@
import type { EventValueUnit } from "@/types/EventItem";
import type { PointAction, PointRuleTierForm } from "@/types/Point";
import { formatTierBoundaryValue, getTierMinText, getTierMinValue, isLastTier, resolveNonNegativeInteger, resolveTierBoundaryValue } from "@/utils/pointRule";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
defineOptions({
name: "PointRuleTierEditor"
@@ -173,20 +173,20 @@ function confirmTierEditor(): void {
: getTierMinValue(tiers.value, index, valueUnit.value);
const pointValue = resolveNonNegativeInteger(tierEditorDraft.pointValueText);
if (min === undefined) {
Toast.warning(index < 1
Message.warning(index < 1
? valueUnit.value === "CENT" ? "首档最小值必须是非负且最多两位小数" : "首档最小值必须是非负整数"
: "请先修正上一档的最大值");
return;
}
if (pointValue === undefined) {
Toast.warning("积分数量必须是大于等于 0 的整数,允许填写 0");
Message.warning("积分数量必须是大于等于 0 的整数,允许填写 0");
return;
}
const shouldAddTier = tierEditorAdding.value && isLastTier(tiers.value, index);
if (!isLastTier(tiers.value, index) || shouldAddTier) {
const max = resolveTierBoundaryValue(tierEditorDraft.maxText, valueUnit.value);
if (max === undefined || max < min) {
Toast.warning(valueUnit.value === "CENT" ? "当前档最大值必须是不小于最小值且最多两位小数" : "当前档最大值必须是不小于最小值的整数");
Message.warning(valueUnit.value === "CENT" ? "当前档最大值必须是不小于最小值且最多两位小数" : "当前档最大值必须是不小于最小值的整数");
return;
}
tier.maxText = formatTierBoundaryValue(max, valueUnit.value);
@@ -206,7 +206,7 @@ function confirmTierEditor(): void {
function addTier(): void {
if (!(tiers.value.length < 100)) {
Toast.warning("最多配置 100 档");
Message.warning("最多配置 100 档");
return;
}
const lastTierIndex = tiers.value.length - 1;
+9 -8
View File
@@ -84,11 +84,12 @@
</template>
<script setup lang="ts">
import { DialogPlugin, Toast, type CalendarProps, type TDate } from "tdesign-mobile-vue";
import { type CalendarProps, DialogPlugin, type TDate } from "tdesign-mobile-vue";
import { useUserStore } from "timi-web";
import StoreAPI from "@/api/StoreAPI";
import type { Store, StoreBusinessDay, StoreBusinessDayStatus } from "@/types/Store";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message";
defineOptions({
name: "StoreBusinessDayCalendar"
@@ -167,7 +168,7 @@ async function handlePanelChange(context: { year: number; month: number }): Prom
try {
await loadCalendar(context.year, context.month);
} catch {
Toast.error("营业日加载失败");
Message.error("营业日加载失败");
}
}
@@ -226,11 +227,11 @@ async function saveDay(): Promise<void> {
} else {
await StoreAPI.createBusinessDay(day);
}
Toast.success("营业日已保存");
Message.success("营业日已保存");
editorVisible.value = false;
await loadCalendar(calendarMonth.year, calendarMonth.month);
} catch {
Toast.error("营业日保存失败");
Message.error("营业日保存失败");
} finally {
isSaving.value = false;
}
@@ -238,7 +239,7 @@ async function saveDay(): Promise<void> {
function validateDay(): boolean {
if (!formModel.dateText) {
Toast.warning("请选择日期");
Message.warning("请选择日期");
return false;
}
return true;
@@ -271,11 +272,11 @@ async function removeDay(id: string): Promise<void> {
isDeleting.value = true;
try {
await StoreAPI.removeBusinessDay(id);
Toast.success("营业日已删除");
Message.success("营业日已删除");
editorVisible.value = false;
await loadCalendar(calendarMonth.year, calendarMonth.month);
} catch {
Toast.error("营业日删除失败");
Message.error("营业日删除失败");
} finally {
isDeleting.value = false;
}
@@ -311,7 +312,7 @@ onMounted(async () => {
]);
store.value = currentStore;
} catch {
Toast.error("营业日数据加载失败");
Message.error("营业日数据加载失败");
}
});
</script>
+7 -6
View File
@@ -56,12 +56,13 @@
</template>
<script setup lang="ts">
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { DialogPlugin } from "tdesign-mobile-vue";
import { useUserStore } from "timi-web";
import StoreAPI from "@/api/StoreAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import type { StoreStatus } from "@/types/Store";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message.ts";
defineOptions({
name: "StoreEdit"
@@ -106,7 +107,7 @@ async function doSave(): Promise<void> {
await StoreAPI.update(formData);
await refreshCurrentStore();
}
Toast.success("门店已保存");
Message.success("门店已保存");
if (userStore.hasPermissions(permissionCodes.store.create)) {
await router.replace("/management/stores");
} else {
@@ -127,11 +128,11 @@ async function refreshCurrentStore(): Promise<void> {
function validateForm(): boolean {
if (!isStoreManagerScope.value && !formData.code) {
Toast.warning("请填写门店编码");
Message.warning("请填写门店编码");
return false;
}
if (!formData.name) {
Toast.warning("请填写门店名称");
Message.warning("请填写门店名称");
return false;
}
return true;
@@ -145,7 +146,7 @@ onMounted(async () => {
const current = await StoreAPI.detail(routeId.value);
Object.assign(formData, current);
} catch {
Toast.error("门店数据加载失败");
Message.error("门店数据加载失败");
}
});
@@ -178,7 +179,7 @@ async function removeStore(): Promise<void> {
isRemoving.value = true;
try {
await StoreAPI.remove(formData.id);
Toast.success("门店已删除");
Message.success("门店已删除");
await router.replace("/management/stores");
} finally {
isRemoving.value = false;
+3 -3
View File
@@ -50,7 +50,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { Time, Toolkit, type Page, type PageResult, useUserStore } from "timi-web";
import StoreAPI from "@/api/StoreAPI";
import { useNavBarStore } from "@/store/navBarStore";
@@ -129,7 +129,7 @@ async function exportExcel(): Promise<void> {
orderMap: page.orderMap
});
Toolkit.downloadBlob(blob, `门店列表-${Time.formatDate(new Date())}.xlsx`);
Toast.success("导出已开始");
Message.success("导出已开始");
} finally {
isExporting.value = false;
}
@@ -152,7 +152,7 @@ onMounted(async () => {
try {
await fetch();
} catch {
Toast.error("门店列表加载失败");
Message.error("门店列表加载失败");
}
});
+5 -4
View File
@@ -46,11 +46,12 @@
</template>
<script setup lang="ts">
import { Toast, type TagProps } from "tdesign-mobile-vue";
import type { TagProps } from "tdesign-mobile-vue";
import { VueDraggableNext } from "vue-draggable-next";
import StoreAPI from "@/api/StoreAPI";
import { useNavBarStore } from "@/store/navBarStore";
import type { Store, StoreStatus } from "@/types/Store";
import { Message } from "@/utils/message";
import { permissionCodes } from "@/utils/permission";
defineOptions({
@@ -100,10 +101,10 @@ async function saveSort(): Promise<void> {
item.sort = index;
});
sortDirty.value = false;
Toast.success("门店排序已保存");
Message.success("门店排序已保存");
await router.back();
} catch {
Toast.error("门店排序保存失败");
Message.error("门店排序保存失败");
} finally {
isSaving.value = false;
}
@@ -135,7 +136,7 @@ onMounted(async () => {
try {
await loadData();
} catch {
Toast.error("门店加载失败");
Message.error("门店加载失败");
}
});
+4 -4
View File
@@ -50,7 +50,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import { gaoRoleCodes, gaoStoreScopePermissionCodes, permissionCodes } from "@/utils/permission";
@@ -93,7 +93,7 @@ function openStorePicker(): void {
}
if (!currentStoreStore.storeList.length) {
Toast.warning("暂无可选门店");
Message.warning("暂无可选门店");
return;
}
@@ -109,7 +109,7 @@ function confirmStorePicker(): void {
currentStoreStore.selectStore(storeId);
storePickerVisible.value = false;
Toast.success("当前门店已切换");
Message.success("当前门店已切换");
}
// ---------- 门店管理 ----------
@@ -122,7 +122,7 @@ async function goStoreManagement(): Promise<void> {
const store = await currentStoreStore.loadLoginStore();
if (!store?.id) {
Toast.warning("未绑定所属门店");
Message.warning("未绑定所属门店");
return;
}
+8 -7
View File
@@ -62,11 +62,12 @@
</template>
<script setup lang="ts">
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { DialogPlugin } from "tdesign-mobile-vue";
import { type Page, useUserStore } from "timi-web";
import TagAPI from "@/api/TagAPI";
import type { Tag } from "@/types/Tag";
import { corePermissionCodes } from "@/utils/permission";
import { Message } from "@/utils/message.ts";
defineOptions({
name: "TagList"
@@ -136,7 +137,7 @@ async function fetch(reset = false): Promise<void> {
isNoMore.value = list.length < page.size || total.value <= tagList.value.length;
} catch {
if (token === requestToken) {
Toast.error("标签加载失败");
Message.error("标签加载失败");
}
} finally {
if (token === requestToken) {
@@ -183,7 +184,7 @@ function closeEditDialog(): void {
function validateForm(): boolean {
if (!formModel.name.trim()) {
Toast.warning("请输入标签名称");
Message.warning("请输入标签名称");
return false;
}
return true;
@@ -207,9 +208,9 @@ async function saveTag(): Promise<void> {
}
editDialogVisible.value = false;
await reload();
Toast.success("标签已保存");
Message.success("标签已保存");
} catch {
Toast.error("标签保存失败");
Message.error("标签保存失败");
} finally {
isSaving.value = false;
}
@@ -243,9 +244,9 @@ async function removeTag(id: string): Promise<void> {
try {
await TagAPI.remove(id);
await reload();
Toast.success("标签已删除");
Message.success("标签已删除");
} catch {
Toast.error("标签删除失败");
Message.error("标签删除失败");
}
}
+11 -11
View File
@@ -55,7 +55,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { Captcha, NotifyAPI, useUserStore, type LoginResponse, Time } from "timi-web";
import ManagedUserAPI from "@/api/ManagedUserAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
@@ -118,23 +118,23 @@ async function validateInvite(): Promise<void> {
function validateForm(): boolean {
if (!/^1\d{10}$/.test(formModel.phoneNo)) {
Toast.warning("请输入正确的 11 位手机号");
Message.warning("请输入正确的 11 位手机号");
return false;
}
if (!formModel.name || formModel.name.length > 191) {
Toast.warning("请输入不超过 191 个字符的用户名");
Message.warning("请输入不超过 191 个字符的用户名");
return false;
}
if (formModel.password.length < 6) {
Toast.warning("密码至少需要 6 个字符");
Message.warning("密码至少需要 6 个字符");
return false;
}
if (formModel.password !== formModel.confirmPassword) {
Toast.warning("两次输入的密码不一致");
Message.warning("两次输入的密码不一致");
return false;
}
if (!formModel.notifyDetailId || !/^\d{6}$/.test(formModel.smsCode)) {
Toast.warning("请先获取并输入短信验证码");
Message.warning("请先获取并输入短信验证码");
return false;
}
return true;
@@ -169,7 +169,7 @@ async function sendSms(): Promise<void> {
}
const captchaId = getCaptchaId();
if (!captchaId) {
Toast.warning("图形验证码尚未加载,请稍后重试");
Message.warning("图形验证码尚未加载,请稍后重试");
await captchaRef.value?.update();
return;
}
@@ -182,7 +182,7 @@ async function sendSms(): Promise<void> {
}
});
startSmsTimer();
Toast.success(`验证码已发送,请检查 ${formModel.phoneNo} 手机短信(易保网络)`);
Message.success(`验证码已发送,请检查 ${formModel.phoneNo} 手机短信(易保网络)`);
} catch {
formModel.notifyDetailId = "";
} finally {
@@ -194,7 +194,7 @@ async function sendSms(): Promise<void> {
async function register(): Promise<void> {
if (isSubmitting.value || isExpired.value || !validateForm()) {
if (isExpired.value) {
Toast.warning("邀请码已失效,请联系邀请人重新生成");
Message.warning("邀请码已失效,请联系邀请人重新生成");
}
return;
}
@@ -212,7 +212,7 @@ async function register(): Promise<void> {
});
await userStore.updateLoginUser(result as LoginResponse);
await currentStoreStore.loadAfterLogin();
Toast.success("注册成功");
Message.success("注册成功");
await router.replace("/management");
} catch {
formModel.smsCode = "";
@@ -222,7 +222,7 @@ async function register(): Promise<void> {
}
async function handleCaptchaError(): Promise<void> {
Toast.warning("验证码加载失败,请点击验证码重试");
Message.warning("验证码加载失败,请点击验证码重试");
}
let expireTimer = 0;
+2 -2
View File
@@ -58,7 +58,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { PassTimeLabel, type User, UserAPI } from "timi-web";
import EventAPI from "@/api/EventAPI";
import ManagedUserAPI from "@/api/ManagedUserAPI";
@@ -186,7 +186,7 @@ onMounted(async () => {
navBarStore.setRightText("编辑", "var(--td-brand-color)", toEdit);
}
} catch {
Toast.error("用户详情加载失败");
Message.error("用户详情加载失败");
}
});
+7 -7
View File
@@ -27,7 +27,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import ManagedUserAPI from "@/api/ManagedUserAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
@@ -81,7 +81,7 @@ const selectedStoreName = computed(() => {
function openStorePicker(): void {
if (!currentStoreStore.storeList.length) {
Toast.warning("暂无可选门店");
Message.warning("暂无可选门店");
return;
}
@@ -177,7 +177,7 @@ async function saveUser(): Promise<void> {
});
}
}
Toast.success("用户已保存");
Message.success("用户已保存");
const detailPath = `/management/users/${saved.id || formModel.id}`;
if (isCreateMode.value) {
await router.replace(detailPath);
@@ -191,15 +191,15 @@ async function saveUser(): Promise<void> {
function validateForm(): boolean {
if (!formModel.name) {
Toast.warning("请填写姓名");
Message.warning("请填写姓名");
return false;
}
if (!formModel.storeId) {
Toast.warning("请选择门店");
Message.warning("请选择门店");
return false;
}
if (isCreateMode.value && !formModel.password) {
Toast.warning("请填写密码");
Message.warning("请填写密码");
return false;
}
return true;
@@ -212,7 +212,7 @@ onMounted(async () => {
try {
await fillForm();
} catch {
Toast.error("用户数据加载失败");
Message.error("用户数据加载失败");
}
});
+5 -5
View File
@@ -24,7 +24,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { createInvitePosterImage, downloadInvitePoster } from "@/utils/qrCode";
defineOptions({ name: "UserInvitePoster" });
@@ -61,9 +61,9 @@ async function savePoster(): Promise<void> {
isDownloading.value = true;
try {
await downloadInvitePoster(posterOptions.value, "GAO-邀请注册海报.png");
Toast.success("海报已保存");
Message.success("海报已保存");
} catch {
Toast.error("海报保存失败");
Message.error("海报保存失败");
} finally {
isDownloading.value = false;
}
@@ -72,9 +72,9 @@ async function savePoster(): Promise<void> {
async function copyLink(): Promise<void> {
try {
await navigator.clipboard.writeText(registerLink);
Toast.success("注册链接已复制");
Message.success("注册链接已复制");
} catch {
Toast.error("复制失败,请检查浏览器权限");
Message.error("复制失败,请检查浏览器权限");
}
}
+2 -2
View File
@@ -83,7 +83,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { type Page, type PageResult, UserAPI, type User, useUserStore } from "timi-web";
import ManagedUserAPI from "@/api/ManagedUserAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
@@ -227,7 +227,7 @@ onMounted(async () => {
try {
await loadData();
} catch {
Toast.error("用户列表加载失败");
Message.error("用户列表加载失败");
}
});
+4 -4
View File
@@ -16,7 +16,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { UserAPI, useUserStore } from "timi-web";
defineOptions({
@@ -39,11 +39,11 @@ const formModel = reactive({
async function savePassword(): Promise<void> {
if (!formModel.oldPassword || !formModel.newPassword) {
Toast.warning("请填写旧密码和新密码");
Message.warning("请填写旧密码和新密码");
return;
}
if (formModel.newPassword !== formModel.confirmPassword) {
Toast.warning("两次输入的新密码不一致");
Message.warning("两次输入的新密码不一致");
return;
}
isSaving.value = true;
@@ -53,7 +53,7 @@ async function savePassword(): Promise<void> {
newValue: formModel.newPassword
});
userStore.clearLoginUser();
Toast.success("密码已更新,请重新登录");
Message.success("密码已更新,请重新登录");
await router.replace("/login");
} finally {
isSaving.value = false;
+5 -4
View File
@@ -53,12 +53,13 @@
</template>
<script setup lang="ts">
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
import { DialogPlugin } from "tdesign-mobile-vue";
import { AttachmentAPI, type Gender, UserAPI, useUserStore } from "timi-web";
import PhotoField from "@/components/PhotoField.vue";
import { useNavBarStore } from "@/store/navBarStore";
import { buildFallbackAvatar } from "@/utils/avatar";
import { compressUploadImage } from "@/utils/imageCompression";
import { Message } from "@/utils/message";
type UserAvatarSource = NonNullable<Parameters<typeof UserAPI.getAvatarURL>[0]> & {
name?: string;
@@ -135,7 +136,7 @@ async function handleAvatarSelected(event: Event): Promise<void> {
const compressedFile = await compressUploadImage(file);
const [tempFile] = await AttachmentAPI.upload(compressedFile);
if (!tempFile?.id) {
Toast.error("头像上传失败");
Message.error("头像上传失败");
return;
}
avatarTempFileId.value = tempFile.id;
@@ -156,7 +157,7 @@ async function toPassword(): Promise<void> {
async function saveProfile(): Promise<void> {
if (!formModel.name) {
Toast.warning("请填写用户名");
Message.warning("请填写用户名");
return;
}
isSaving.value = true;
@@ -169,7 +170,7 @@ async function saveProfile(): Promise<void> {
tempFileIdList: avatarTempFileId.value ? [avatarTempFileId.value] : undefined
});
await userStore.updateLoginUser(result);
Toast.success("资料已保存");
Message.success("资料已保存");
await router.back();
} finally {
isSaving.value = false;
+5 -5
View File
@@ -39,7 +39,7 @@
<script setup lang="ts">
import type { DropdownOption, DropdownValue } from "tdesign-mobile-vue";
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { RoleAPI, type ModuleCode, type Role as UserRole, useUserStore } from "timi-web";
import ManagedUserAPI from "@/api/ManagedUserAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
@@ -198,7 +198,7 @@ async function loadActiveUserRoles(): Promise<void> {
async function saveRoleList(): Promise<void> {
const current = activeUser.value;
if (!current?.id || !current.userId) {
Toast.warning("请选择用户");
Message.warning("请选择用户");
return;
}
@@ -210,14 +210,14 @@ async function saveRoleList(): Promise<void> {
roleIdList: [...checkedRoleIds.value]
});
await loadActiveUserRoles();
Toast.success("用户角色已保存");
Message.success("用户角色已保存");
} catch (error) {
checkedRoleIds.value = [];
try {
await reloadAuthorizationScope();
await loadActiveUserRoles();
} finally {
Toast.error(getErrorMessage(error, "用户角色授权失败"));
Message.error(getErrorMessage(error, "用户角色授权失败"));
}
} finally {
isSaving.value = false;
@@ -285,7 +285,7 @@ onMounted(async () => {
try {
await loadData();
} catch {
Toast.error("用户角色加载失败");
Message.error("用户角色加载失败");
}
});
+2 -2
View File
@@ -19,7 +19,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { Captcha, useUserStore } from "timi-web";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
@@ -56,7 +56,7 @@ function getRedirectPath(): string {
function validateForm(): boolean {
if (!formModel.user || !formModel.password || !formModel.captcha || !captchaRef.value?.captchaId) {
Toast.warning("请输入账号、密码和验证码");
Message.warning("请输入账号、密码和验证码");
return false;
}
return true;
+3 -3
View File
@@ -44,7 +44,7 @@
</template>
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import ManagedUserAPI from "@/api/ManagedUserAPI";
import { useCurrentStoreStore } from "@/store/currentStoreStore";
import { coreRoleCodes, gaoRoleCodes } from "@/utils/permission";
@@ -123,7 +123,7 @@ function confirmPicker(): void {
async function generateInvite(): Promise<void> {
if (!formModel.roleId || (shouldSelectStore.value && !formModel.storeId)) {
Toast.warning(shouldSelectStore.value ? "请选择角色和门店" : "请选择角色");
Message.warning(shouldSelectStore.value ? "请选择角色和门店" : "请选择角色");
return;
}
isGenerating.value = true;
@@ -157,7 +157,7 @@ watch(() => props.visible, async visible => {
try {
await loadData();
} catch {
Toast.error("邀请配置加载失败");
Message.error("邀请配置加载失败");
}
});
</script>
+3 -3
View File
@@ -1,4 +1,4 @@
import { Toast } from "tdesign-mobile-vue";
import { Message } from "@/utils/message";
import { useUserStore } from "timi-web";
import StoreAPI from "@/api/StoreAPI";
import type { Store } from "@/types/Store";
@@ -42,7 +42,7 @@ export const useCurrentStoreStore = defineStore("currentStore", () => {
storeList.value = result.list || [];
normalizeCurrentStoreId();
} catch {
Toast.error("门店列表加载失败");
Message.error("门店列表加载失败");
} finally {
isLoading.value = false;
}
@@ -94,7 +94,7 @@ export const useCurrentStoreStore = defineStore("currentStore", () => {
try {
await loadLoginStore();
} catch {
Toast.error("登录门店加载失败");
Message.error("登录门店加载失败");
}
if (isGlobalManager) {
await loadStoreList();