chore(frontend): introduce prettier + eslint and prune unused code
Backend CI / Backend (push) Has been cancelled
Frontend CI / Frontend (push) Failing after 1m39s

- Add Prettier 3 with prettier-plugin-organize-imports (sorts/removes unused imports)
- Add ESLint 10 flat config with typescript-eslint + eslint-plugin-vue + eslint-config-prettier
- Add root scripts: format, format:check, lint, lint:fix
- Reformat 257 files across admin-web, ops-web, desktop-client, packages
- Remove unused locals/exports flagged by --noUnusedLocals/--noUnusedParameters
- Fix duplicate localTabLabel key, surrogate-pair regex u-flag, NBSP literal in regex
- Skip server/ (Go) and apps/browser-extension/ (deprecated per ADR)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-01 20:39:09 +08:00
parent 21c7892ee4
commit 162abdc97c
258 changed files with 42261 additions and 37556 deletions
+59 -56
View File
@@ -1,7 +1,7 @@
import { defineStore } from "pinia";
import { computed, ref } from "vue";
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import { http } from "@/lib/http";
import { http } from '@/lib/http'
import {
type OperatorView,
clearStoredSession,
@@ -9,66 +9,69 @@ import {
readStoredSession,
writeLoginPreference,
writeStoredSession,
} from "@/lib/storage";
} from '@/lib/storage'
interface LoginResponse {
access_token: string;
expires_at: number;
operator: OperatorView;
access_token: string
expires_at: number
operator: OperatorView
}
export const useAuthStore = defineStore("ops-auth", () => {
const accessToken = ref<string | null>(null);
const expiresAt = ref<number | null>(null);
const operator = ref<OperatorView | null>(null);
const initialized = ref(false);
const persistent = ref(false);
export const useAuthStore = defineStore('ops-auth', () => {
const accessToken = ref<string | null>(null)
const expiresAt = ref<number | null>(null)
const operator = ref<OperatorView | null>(null)
const initialized = ref(false)
const persistent = ref(false)
function hydrate(): void {
const stored = readStoredSession();
accessToken.value = stored.session.accessToken;
expiresAt.value = stored.session.expiresAt;
operator.value = stored.session.operator;
persistent.value = stored.persistent;
initialized.value = true;
const stored = readStoredSession()
accessToken.value = stored.session.accessToken
expiresAt.value = stored.session.expiresAt
operator.value = stored.session.operator
persistent.value = stored.persistent
initialized.value = true
}
let loginPromise: Promise<void> | null = null;
let loginPromise: Promise<void> | null = null
async function login(username: string, password: string, remember: boolean): Promise<void> {
if (loginPromise) {
return loginPromise;
return loginPromise
}
const payload = { username, password, remember };
loginPromise = http.post<LoginResponse>("/auth/login", {
username: payload.username,
password: payload.password,
}).then((result) => {
accessToken.value = result.access_token;
expiresAt.value = result.expires_at;
operator.value = result.operator;
persistent.value = payload.remember;
writeStoredSession(
{
accessToken: result.access_token,
expiresAt: result.expires_at,
operator: result.operator,
},
payload.remember,
);
writeLoginPreference({ remember: payload.remember, lastUsername: payload.username });
}).finally(() => {
loginPromise = null;
});
const payload = { username, password, remember }
loginPromise = http
.post<LoginResponse>('/auth/login', {
username: payload.username,
password: payload.password,
})
.then((result) => {
accessToken.value = result.access_token
expiresAt.value = result.expires_at
operator.value = result.operator
persistent.value = payload.remember
writeStoredSession(
{
accessToken: result.access_token,
expiresAt: result.expires_at,
operator: result.operator,
},
payload.remember,
)
writeLoginPreference({ remember: payload.remember, lastUsername: payload.username })
})
.finally(() => {
loginPromise = null
})
return loginPromise;
return loginPromise
}
async function refreshSelf(): Promise<void> {
if (!accessToken.value) return;
if (!accessToken.value) return
try {
const me = await http.get<OperatorView & { last_login_at: string | null }>("/auth/me");
const me = await http.get<OperatorView & { last_login_at: string | null }>('/auth/me')
operator.value = {
id: me.id,
username: me.username,
@@ -76,7 +79,7 @@ export const useAuthStore = defineStore("ops-auth", () => {
email: me.email,
role: me.role,
status: me.status,
};
}
writeStoredSession(
{
accessToken: accessToken.value,
@@ -84,21 +87,21 @@ export const useAuthStore = defineStore("ops-auth", () => {
operator: operator.value,
},
persistent.value,
);
)
} catch {
logout();
logout()
}
}
function logout(): void {
accessToken.value = null;
expiresAt.value = null;
operator.value = null;
persistent.value = false;
clearStoredSession();
accessToken.value = null
expiresAt.value = null
operator.value = null
persistent.value = false
clearStoredSession()
}
const isAuthenticated = computed(() => !!accessToken.value);
const isAuthenticated = computed(() => !!accessToken.value)
return {
accessToken,
@@ -112,5 +115,5 @@ export const useAuthStore = defineStore("ops-auth", () => {
refreshSelf,
logout,
readLoginPreference,
};
});
}
})
+2 -2
View File
@@ -1,3 +1,3 @@
import { createPinia } from "pinia";
import { createPinia } from 'pinia'
export const pinia = createPinia();
export const pinia = createPinia()