refactor file tree

This commit is contained in:
Timi
2026-08-11 15:24:36 +08:00
parent 575d41b2e2
commit 819c1623eb
42 changed files with 86 additions and 86 deletions
@@ -65,18 +65,18 @@
<script setup lang="ts">
import { Toast } from "tdesign-mobile-vue";
import {
calculateManagementQrCodeGrid,
downloadManagementQrCodeImages,
printManagementQrCodeImages,
splitManagementQrCodePages
} from "@/utils/managementQrCode";
calculateQrCodeGrid,
downloadQrCodeImages,
printQrCodeImages,
splitQrCodePages
} from "@/utils/qrCode";
import { permissionCodes } from "@/utils/permission";
defineOptions({
name: "ManagementQrCode"
name: "CustomerQrCode"
});
interface ManagementQrCodeFormModel {
interface QrCodeFormModel {
prefix: string;
start: string;
digits: number;
@@ -88,7 +88,7 @@ const maxDigits = 16;
const defaultDigits = 3;
const storageKey = "management-qr-code-config";
const formModel = reactive<ManagementQrCodeFormModel>({
const formModel = reactive<QrCodeFormModel>({
prefix: "GAO",
start: "1",
digits: defaultDigits,
@@ -110,9 +110,9 @@ const codeList = computed(() => {
const startMinDigits = computed(() => Math.max(minDigits, Math.min(maxDigits, normalizeNumber(formModel.start).length || minDigits)));
const effectiveDigits = computed(() => Math.max(startMinDigits.value, Math.min(maxDigits, formModel.digits || defaultDigits)));
const maxCodeLength = computed(() => formModel.prefix.length + effectiveDigits.value);
const previewPages = computed(() => splitManagementQrCodePages(codeList.value, maxCodeLength.value));
const previewPages = computed(() => splitQrCodePages(codeList.value, maxCodeLength.value));
const visiblePreviewPages = computed(() => previewPages.value.slice(0, 1));
const paperGrid = computed(() => calculateManagementQrCodeGrid(maxCodeLength.value));
const paperGrid = computed(() => calculateQrCodeGrid(maxCodeLength.value));
const paperStyle = computed(() => ({
gridTemplateRows: `repeat(${paperGrid.value.rows}, minmax(0, 1fr))`,
gridTemplateColumns: `repeat(${paperGrid.value.columns}, minmax(0, 1fr))`
@@ -144,7 +144,7 @@ function loadLocalConfig(): void {
}
try {
const config = JSON.parse(cache) as Partial<ManagementQrCodeFormModel>;
const config = JSON.parse(cache) as Partial<QrCodeFormModel>;
const start = normalizeNumber(config.start);
const startDigits = Math.max(minDigits, Math.min(maxDigits, start.length || minDigits));
@@ -197,7 +197,7 @@ async function downloadImages(): Promise<void> {
downloading.value = true;
try {
await downloadManagementQrCodeImages({
await downloadQrCodeImages({
codes: codeList.value,
filePrefix: `${finalStartCode.value}-${finalEndCode.value}`,
maxCodeLength: maxCodeLength.value
@@ -214,7 +214,7 @@ async function printQrCode(): Promise<void> {
printing.value = true;
try {
await printManagementQrCodeImages({
await printQrCodeImages({
codes: codeList.value,
maxCodeLength: maxCodeLength.value,
title: `${finalStartCode.value}-${finalEndCode.value}`
@@ -48,7 +48,7 @@ import SegmentedSlider from "@/components/SegmentedSlider.vue";
import { useSettingStore } from "@/store/settingStore";
defineOptions({
name: "ManagementSettings"
name: "AppSettings"
});
const globalUIStore = useGlobalUIStore();
@@ -54,7 +54,7 @@ interface ChartProfile {
}
defineOptions({
name: "ManagementDataCharts"
name: "StoreDataCharts"
});
use([
@@ -17,7 +17,7 @@ import { useUserStore } from "timi-web";
import { permissionCodes } from "@/utils/permission";
defineOptions({
name: "CustomerTab"
name: "HomeTab"
});
const router = useRouter();
@@ -96,7 +96,7 @@ type MenuGroup = {
};
defineOptions({
name: "ManagementTab"
name: "SettingTab"
});
const router = useRouter();
@@ -20,7 +20,7 @@ import { Toast } from "tdesign-mobile-vue";
import { UserAPI, useUserStore } from "timi-web";
defineOptions({
name: "ManagementPassword"
name: "UserPassword"
});
const router = useRouter();
@@ -61,7 +61,7 @@ type UserAvatarSource = NonNullable<Parameters<typeof UserAPI.getAvatarURL>[0]>
};
type ProfileGender = Gender | "";
defineOptions({
name: "ManagementProfile"
name: "UserProfile"
});
const router = useRouter();
+4 -4
View File
@@ -3,8 +3,8 @@ import type { RouteRecordRaw } from "vue-router";
const chartRoutes: RouteRecordRaw[] = [
{
path: "/management/data-charts",
name: "ManagementDataCharts",
component: () => import("@/pages/management/ManagementDataCharts.vue"),
name: "StoreDataCharts",
component: () => import("@/pages/store/StoreDataCharts.vue"),
meta: {
depth: 3,
navBarVisible: true,
@@ -18,7 +18,7 @@ const chartRoutes: RouteRecordRaw[] = [
{
path: "/management/customer-data-charts",
name: "CustomerDataCharts",
component: () => import("@/pages/management/CustomerDataCharts.vue"),
component: () => import("@/pages/customer/CustomerDataCharts.vue"),
meta: {
depth: 3,
navBarVisible: true,
@@ -32,7 +32,7 @@ const chartRoutes: RouteRecordRaw[] = [
{
path: "/management/customers/:id/data-charts",
name: "CustomerDataChartsFromCustomer",
component: () => import("@/pages/management/CustomerDataCharts.vue"),
component: () => import("@/pages/customer/CustomerDataCharts.vue"),
meta: {
depth: 5,
navBarVisible: true,
+6 -6
View File
@@ -1,10 +1,10 @@
import type { RouteRecordRaw } from "vue-router";
import QuickEntryPage from "@/pages/customer/QuickEntryPage.vue";
import QuickSignInPage from "@/pages/customer/QuickSignInPage.vue";
import EventRecordEdit from "@/pages/management/EventRecordEdit.vue";
import CustomerList from "@/pages/management/CustomerList.vue";
import CustomerDetail from "@/pages/management/CustomerDetail.vue";
import CustomerEdit from "@/pages/management/CustomerEdit.vue";
import QuickEntryPage from "@/pages/home/QuickEntryPage.vue";
import QuickSignInPage from "@/pages/home/QuickSignInPage.vue";
import EventRecordEdit from "@/pages/event/EventRecordEdit.vue";
import CustomerList from "@/pages/customer/CustomerList.vue";
import CustomerDetail from "@/pages/customer/CustomerDetail.vue";
import CustomerEdit from "@/pages/customer/CustomerEdit.vue";
const customerRoutes: RouteRecordRaw[] = [
{
+16 -16
View File
@@ -1,12 +1,12 @@
import type { RouteRecordRaw } from "vue-router";
import ManagementSettings from "@/pages/management/ManagementSettings.vue";
import ManagementProfile from "@/pages/management/ManagementProfile.vue";
import ManagementPassword from "@/pages/management/ManagementPassword.vue";
import ManagementQrCode from "@/pages/management/ManagementQrCode.vue";
import StoreBusinessDayCalendar from "@/pages/management/StoreBusinessDayCalendar.vue";
import StoreEdit from "@/pages/management/StoreEdit.vue";
import StoreList from "@/pages/management/StoreList.vue";
import StoreSort from "@/pages/management/StoreSort.vue";
import AppSettings from "@/pages/setting/AppSettings.vue";
import UserProfile from "@/pages/user/UserProfile.vue";
import UserPassword from "@/pages/user/UserPassword.vue";
import CustomerQrCode from "@/pages/customer/CustomerQrCode.vue";
import StoreBusinessDayCalendar from "@/pages/store/StoreBusinessDayCalendar.vue";
import StoreEdit from "@/pages/store/StoreEdit.vue";
import StoreList from "@/pages/store/StoreList.vue";
import StoreSort from "@/pages/store/StoreSort.vue";
export const storeRoutes: RouteRecordRaw[] = [
{
@@ -84,8 +84,8 @@ export const storeRoutes: RouteRecordRaw[] = [
export const managementSettingRoutes: RouteRecordRaw[] = [
{
path: "/management/settings",
name: "ManagementSettings",
component: ManagementSettings,
name: "AppSettings",
component: AppSettings,
meta: {
depth: 3,
navBarVisible: true,
@@ -101,8 +101,8 @@ export const managementSettingRoutes: RouteRecordRaw[] = [
export const managementAccountRoutes: RouteRecordRaw[] = [
{
path: "/management/profile",
name: "ManagementProfile",
component: ManagementProfile,
name: "UserProfile",
component: UserProfile,
meta: {
depth: 3,
navBarVisible: true,
@@ -115,8 +115,8 @@ export const managementAccountRoutes: RouteRecordRaw[] = [
},
{
path: "/management/profile/password",
name: "ManagementPassword",
component: ManagementPassword,
name: "UserPassword",
component: UserPassword,
meta: {
depth: 4,
navBarVisible: true,
@@ -129,8 +129,8 @@ export const managementAccountRoutes: RouteRecordRaw[] = [
},
{
path: "/management/qr-code",
name: "ManagementQrCode",
component: ManagementQrCode,
name: "CustomerQrCode",
component: CustomerQrCode,
meta: {
depth: 3,
navBarVisible: true,
+8 -8
View File
@@ -1,12 +1,12 @@
import type { RouteRecordRaw } from "vue-router";
import PermissionSettings from "@/pages/management/PermissionSettings.vue";
import RoleList from "@/pages/management/RoleList.vue";
import RoleEdit from "@/pages/management/RoleEdit.vue";
import PermissionList from "@/pages/management/PermissionList.vue";
import PermissionEdit from "@/pages/management/PermissionEdit.vue";
import RolePermissionAssign from "@/pages/management/RolePermissionAssign.vue";
import RoleDelegationPermissionAssign from "@/pages/management/RoleDelegationPermissionAssign.vue";
import UserRoleAssign from "@/pages/management/UserRoleAssign.vue";
import PermissionSettings from "@/pages/permission/PermissionSettings.vue";
import RoleList from "@/pages/permission/RoleList.vue";
import RoleEdit from "@/pages/permission/RoleEdit.vue";
import PermissionList from "@/pages/permission/PermissionList.vue";
import PermissionEdit from "@/pages/permission/PermissionEdit.vue";
import RolePermissionAssign from "@/pages/permission/RolePermissionAssign.vue";
import RoleDelegationPermissionAssign from "@/pages/permission/RoleDelegationPermissionAssign.vue";
import UserRoleAssign from "@/pages/user/UserRoleAssign.vue";
const permissionRoutes: RouteRecordRaw[] = [
{
+6 -6
View File
@@ -1,10 +1,10 @@
import type { RouteRecordRaw } from "vue-router";
import EventEdit from "@/pages/management/EventEdit.vue";
import eventList from "@/pages/management/EventList.vue";
import EventSort from "@/pages/management/EventSort.vue";
import EventRecordDetail from "@/pages/management/EventRecordDetail.vue";
import EventRecordEdit from "@/pages/management/EventRecordEdit.vue";
import EventRecordList from "@/pages/management/EventRecordList.vue";
import EventEdit from "@/pages/event/EventEdit.vue";
import eventList from "@/pages/event/EventList.vue";
import EventSort from "@/pages/event/EventSort.vue";
import EventRecordDetail from "@/pages/event/EventRecordDetail.vue";
import EventRecordEdit from "@/pages/event/EventRecordEdit.vue";
import EventRecordList from "@/pages/event/EventRecordList.vue";
const registrationRoutes: RouteRecordRaw[] = [
{
+6 -6
View File
@@ -1,12 +1,12 @@
import type { RouteRecordRaw } from "vue-router";
import CustomerTab from "@/pages/tabs/CustomerTab.vue";
import ManagementTab from "@/pages/tabs/ManagementTab.vue";
import HomeTab from "@/pages/tabs/HomeTab.vue";
import SettingTab from "@/pages/tabs/SettingTab.vue";
const tabRoutes: RouteRecordRaw[] = [
{
path: "/customers",
name: "CustomerTab",
component: CustomerTab,
name: "HomeTab",
component: HomeTab,
meta: {
depth: 2,
navBarVisible: true,
@@ -19,8 +19,8 @@ const tabRoutes: RouteRecordRaw[] = [
},
{
path: "/management",
name: "ManagementTab",
component: ManagementTab,
name: "SettingTab",
component: SettingTab,
meta: {
depth: 2,
navBarVisible: true,
+4 -4
View File
@@ -1,8 +1,8 @@
import type { RouteRecordRaw } from "vue-router";
import UserList from "@/pages/management/UserList.vue";
import UserDetail from "@/pages/management/UserDetail.vue";
import UserEdit from "@/pages/management/UserEdit.vue";
import UserRoleAssign from "@/pages/management/UserRoleAssign.vue";
import UserList from "@/pages/user/UserList.vue";
import UserDetail from "@/pages/user/UserDetail.vue";
import UserEdit from "@/pages/user/UserEdit.vue";
import UserRoleAssign from "@/pages/user/UserRoleAssign.vue";
const userRoutes: RouteRecordRaw[] = [
{
@@ -1,23 +1,23 @@
import { BarcodeFormat, EncodeHintType, QRCodeWriter } from "@zxing/library";
export interface ManagementQrCodePage {
export interface QrCodePage {
pageIndex: number;
codes: string[];
}
export interface DownloadManagementQrCodeOptions {
export interface DownloadQrCodeOptions {
codes: string[];
filePrefix: string;
maxCodeLength?: number;
}
export interface PrintManagementQrCodeOptions {
export interface PrintQrCodeOptions {
codes: string[];
maxCodeLength?: number;
title?: string;
}
export interface ManagementQrCodeGrid {
export interface QrCodeGrid {
rows: number;
columns: number;
pageSize: number;
@@ -40,7 +40,7 @@ const qrEncodeHints = new Map<EncodeHintType, string | number>([
[EncodeHintType.MARGIN, 4]
]);
export function calculateManagementQrCodeGrid(maxCodeLength = 0): ManagementQrCodeGrid {
export function calculateQrCodeGrid(maxCodeLength = 0): QrCodeGrid {
const codeTextMinWidth = Math.ceil(maxCodeLength * codeFontSize * codeTextWidthRatio + codeTextHorizontalPadding);
const cellMinWidth = Math.max(qrSize + minCellGap, codeTextMinWidth + minCellGap);
const cellMinHeight = qrSize + codeTopGap + codeFontSize + minCellGap;
@@ -54,9 +54,9 @@ export function calculateManagementQrCodeGrid(maxCodeLength = 0): ManagementQrCo
};
}
export function splitManagementQrCodePages(codes: string[], maxCodeLength = 0): ManagementQrCodePage[] {
const pages: ManagementQrCodePage[] = [];
const pageSize = calculateManagementQrCodeGrid(maxCodeLength).pageSize;
export function splitQrCodePages(codes: string[], maxCodeLength = 0): QrCodePage[] {
const pages: QrCodePage[] = [];
const pageSize = calculateQrCodeGrid(maxCodeLength).pageSize;
for (let index = 0; index < codes.length; index += pageSize) {
pages.push({
@@ -68,23 +68,23 @@ export function splitManagementQrCodePages(codes: string[], maxCodeLength = 0):
return pages;
}
export async function downloadManagementQrCodeImages(options: DownloadManagementQrCodeOptions): Promise<void> {
const pages = splitManagementQrCodePages(options.codes, options.maxCodeLength);
export async function downloadQrCodeImages(options: DownloadQrCodeOptions): Promise<void> {
const pages = splitQrCodePages(options.codes, options.maxCodeLength);
for (const page of pages) {
const canvas = renderManagementQrCodePage(page.codes, options.maxCodeLength);
const canvas = renderQrCodePage(page.codes, options.maxCodeLength);
await downloadCanvas(canvas, `${options.filePrefix}-${String(page.pageIndex + 1).padStart(2, "0")}.png`);
}
}
export async function printManagementQrCodeImages(options: PrintManagementQrCodeOptions): Promise<void> {
export async function printQrCodeImages(options: PrintQrCodeOptions): Promise<void> {
const printWindow = window.open("", "_blank");
if (!printWindow) {
throw new Error("浏览器阻止了打印窗口,请允许弹出窗口后重试");
}
const pages = splitManagementQrCodePages(options.codes, options.maxCodeLength);
const imageList = pages.map(page => renderManagementQrCodePage(page.codes, options.maxCodeLength).toDataURL("image/png"));
const pages = splitQrCodePages(options.codes, options.maxCodeLength);
const imageList = pages.map(page => renderQrCodePage(page.codes, options.maxCodeLength).toDataURL("image/png"));
const title = options.title || "客户二维码打印";
const imageHTML = imageList.map(src => `<section class="page"><img src="${src}" alt="客户二维码" /></section>`).join("");
@@ -138,11 +138,11 @@ export async function printManagementQrCodeImages(options: PrintManagementQrCode
printWindow.print();
}
function renderManagementQrCodePage(codes: string[], maxCodeLength = 0): HTMLCanvasElement {
function renderQrCodePage(codes: string[], maxCodeLength = 0): HTMLCanvasElement {
const canvas = document.createElement("canvas");
canvas.width = pageWidth;
canvas.height = pageHeight;
const grid = calculateManagementQrCodeGrid(maxCodeLength);
const grid = calculateQrCodeGrid(maxCodeLength);
const context = canvas.getContext("2d");
if (!context) {
@@ -199,7 +199,7 @@ function escapeHTML(value: string): string {
.replaceAll("\"", "&quot;");
}
function drawGridLines(context: CanvasRenderingContext2D, grid: ManagementQrCodeGrid, cellWidth: number, cellHeight: number): void {
function drawGridLines(context: CanvasRenderingContext2D, grid: QrCodeGrid, cellWidth: number, cellHeight: number): void {
context.strokeStyle = "#d1d5db";
context.lineWidth = gridLineWidth;