This commit is contained in:
owenchen committed 2026-10-15 19:26:18 +08:00
1 parent 23d14ba54c
commit dcc112c076
17 files changed
+636 -31

No files matched your search

@@ -21,6 +21,7 @@ import { SecurityActorData } from "@/data/auto/securityActorData";
import { SecurityActorGroupViewEntity } from "@/data/auto/securityActorGroupViewEntity";
import { SecurityUserActorViewEntity } from "@/data/auto/securityUserActorViewEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityActorService from "@/service/security/securityActorService";
const { t } = useLocale();
@@ -135,7 +136,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityActorService.Delete(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -151,7 +152,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -163,7 +164,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
// 组别选择:跳 group-enquiry(多选),回传后按 GroupName 去重合并
@@ -20,6 +20,7 @@ import { useAdminPick, useAuthGuard } from "@/composables";
import { SecurityFunctionData } from "@/data/auto/securityFunctionData";
import { SecurityFunctionMapViewEntity } from "@/data/auto/securityFunctionMapViewEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityFunctionService from "@/service/security/securityFunctionService";
const { t } = useLocale();
@@ -148,7 +149,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityFunctionService.Delete(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -164,7 +165,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -176,7 +177,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
// 权限名称:单选 permission-enquiry,回传写进 FunctionName 之外不影响
@@ -16,6 +16,7 @@ import { computed, ref } from "vue";
import { useAuthGuard } from "@/composables";
import { SecurityGeneratorNumberEntity } from "@/data/auto/securityGeneratorNumberEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityGeneratorNumberService from "@/service/security/securityGeneratorNumberService";
const { t } = useLocale();
@@ -120,7 +121,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
onLoad((options) => {
@@ -22,6 +22,7 @@ import { SecurityGroupData } from "@/data/auto/securityGroupData";
import { SecurityGroupPermissionDependentViewDisplayData } from "@/data/auto/securityGroupPermissionDependentViewDisplayData";
import { SecurityGroupPermissionViewDisplayData } from "@/data/auto/securityGroupPermissionViewDisplayData";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityGroupService from "@/service/security/securityGroupService";
const { t } = useLocale();
@@ -130,7 +131,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityGroupService.Delete(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -146,7 +147,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -158,7 +159,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
// 权限勾选:四个 boolean 直接落在 DisplayData 上(与旧 GroupPermissionActions 一致)
@@ -17,6 +17,7 @@ import { useAuthGuard } from "@/composables";
import { SecurityHelpFeatureData } from "@/data/auto/securityHelpFeatureData";
import { SecurityHelpFeatureEntity } from "@/data/auto/securityHelpFeatureEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityHelpFunctionService from "@/service/security/securityHelpFunctionService";
const { t } = useLocale();
@@ -123,7 +124,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityHelpFunctionService.DeleteByGroupCode(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -139,7 +140,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -151,7 +152,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
function addFeature(): void {
@@ -13,6 +13,8 @@
* 删除走 DeleteByFunctionName;新建默认 EnabledIndc='Y'。
*/
import type { AdminFormAction, AdminFormField, AdminFormSection } from "@/admin/admin-types";
import type { HelpFeatureVM, HelpStepVM } from "@/admin/help-preview-types";
import type { SecurityHelpFeatureEntity } from "@/data/auto/securityHelpFeatureEntity";
import type { SecurityHelpFeatureGroupEntity } from "@/data/auto/securityHelpFeatureGroupEntity";
import { onLoad } from "@dcloudio/uni-app";
import { useLocale } from "uview-pro";
@@ -22,6 +24,7 @@ import { SecurityHelpFunctionData } from "@/data/auto/securityHelpFunctionData";
import { SecurityHelpFunctionFeatureEntity } from "@/data/auto/securityHelpFunctionFeatureEntity";
import { SecurityHelpStepEntity } from "@/data/auto/securityHelpStepEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityHelpFunctionService from "@/service/security/securityHelpFunctionService";
const { t } = useLocale();
@@ -37,6 +40,14 @@ const isNew = computed(() => !String(helpFunction.value.CreatedBy ?? "").trim())
/** 组表:把功能点上的「组主键」翻译成「组编码」 */
const groups = ref<SecurityHelpFeatureGroupEntity[]>([]);
/** 全部功能点明细(FindAll 带回),预览时按组主键展开成「功能点与图标说明」 */
const allFeatures = ref<SecurityHelpFeatureEntity[]>([]);
/** 预览弹窗状态:openPreview 时按当前界面数据现拼,不额外发请求 */
const previewVisible = ref(false);
const previewSteps = ref<HelpStepVM[]>([]);
const previewFeatures = ref<HelpFeatureVM[]>([]);
const heroTitle = computed(() => String(helpFunction.value.FunctionName || ""));
const heroChips = computed(() => {
const chips: string[] = [];
@@ -69,7 +80,8 @@ const sections = computed<AdminFormSection[]>(() => {
});
const actions = computed<AdminFormAction[]>(() => {
const list: AdminFormAction[] = [];
// 预览:不分查看/编辑态都可点,让管理员随时看这份帮助最终长什么样
const list: AdminFormAction[] = [{ key: "preview", label: t("HelpFunctionPage.previewBut") }];
if (perm.canAmend.value) {
list.push({ key: "amend", label: t("AdminPage.amendBut"), when: "view" });
}
@@ -100,6 +112,7 @@ async function loadGroups(): Promise<void> {
try {
const all = await securityHelpFunctionService.FindAll();
groups.value = all?.SecurityHelpFeatureGroups ?? [];
allFeatures.value = all?.SecurityHelpFeatures ?? [];
}
catch (error) {
console.warn(error);
@@ -166,11 +179,14 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityHelpFunctionService.DeleteByFunctionName(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
switch (action.key) {
case "preview":
openPreview();
break;
case "amend":
readonly.value = false;
break;
@@ -182,7 +198,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -194,7 +210,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
// 功能名称:新建时单选 function-enquiry 回填(旧页用 FindFunctionNameOptions 下拉,移动端退化成选择器)
@@ -278,6 +294,37 @@ function downStep(index: number): void {
swap(data.value.SecurityHelpSteps, index, 1);
}
/** 预览:把当前界面的步骤与引用组功能点拼成最终用户看到的帮助文档,弹窗展示 */
function openPreview(): void {
ensureLists();
// 步骤按界面顺序(数组序即显示序,StepNo 要到保存时才重排)
previewSteps.value = data.value.SecurityHelpSteps.map(step => ({
title: String(step.Title ?? ""),
desc: String(step.Description ?? ""),
tips: String(step.Tips ?? ""),
icon: String(step.Icon ?? ""),
}));
// 功能点:每个引用组按组主键展开成组内明细,组内按 SortNo 升序
const items: HelpFeatureVM[] = [];
for (const link of data.value.SecurityHelpFunctionFeatures) {
const groupId = groups.value.find(g => g.GroupCode === link.GroupCode)?.HelpFeatureGroupId;
if (!groupId) {
continue;
}
allFeatures.value
.filter(feature => feature.HelpFeatureGroupId === groupId)
.sort((a, b) => (a.SortNo ?? 0) - (b.SortNo ?? 0))
.forEach(feature => items.push({
name: String(feature.Name ?? ""),
desc: String(feature.Description ?? ""),
icon: String(feature.Icon ?? ""),
color: String(feature.Color ?? ""),
}));
}
previewFeatures.value = items;
previewVisible.value = true;
}
onLoad((options) => {
routeId.value = String(options?.id ?? "");
const mode = String(options?.mode ?? "view");
@@ -436,6 +483,9 @@ useAuthGuard(() => {
</view>
</template>
</admin-form>
<help-doc-preview :visible="previewVisible" :title="heroTitle" :intro="helpFunction.Intro" :steps="previewSteps"
:features="previewFeatures" @close="previewVisible = false" />
</template>
<style lang="scss" scoped>
@@ -16,6 +16,7 @@ import { computed, ref } from "vue";
import { useAuthGuard } from "@/composables";
import { SecurityMasterEntity } from "@/data/auto/securityMasterEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityMasterService from "@/service/security/securityMasterService";
const { t } = useLocale();
@@ -146,7 +147,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityMasterService.Delete(dataKey.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -162,7 +163,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !isValidKey()) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -174,7 +175,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
onLoad((options) => {
@@ -17,6 +17,7 @@ import { useAuthGuard } from "@/composables";
import { SecurityPermissionData } from "@/data/auto/securityPermissionData";
import { SecurityPermissionDependentEntity } from "@/data/auto/securityPermissionDependentEntity";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityPermissionService from "@/service/security/securityPermissionService";
const { t } = useLocale();
@@ -140,7 +141,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityPermissionService.Delete(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -156,7 +157,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -168,7 +169,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
function addDependent(): void {
@@ -179,7 +179,7 @@ useAuthGuard(() => {
<template>
<view class="page">
<admin-list ref="listRef" v-model:keyword="keyword" :nav-title="t('UserPage.title')" :show-nav-back="isPick"
<admin-list ref="listRef" v-model:keyword="keyword" :nav-title="t('UserPage.title')" :show-nav-back="!isPick"
:columns="columns" :loader="state.query" :row-key="SecurityUserEntity.USER_NAME" title-key="UserLocalName"
:selectable="isPick ? pickTarget.multiple.value : Boolean(perm.canDelete.value)" :filter-count="filterCount"
:filter-visible="filterVisible" :filter-items="draft" :search-token="searchToken"
@@ -24,6 +24,7 @@ import { useAdminPick, useAuthGuard } from "@/composables";
import { SecurityUserActorViewEntity } from "@/data/auto/securityUserActorViewEntity";
import { SecurityUserData } from "@/data/auto/securityUserData";
import { usePagePermission } from "@/permission/permission-context";
import { smartBack } from "@/router/routes";
import securityUserService from "@/service/security/securityUserService";
const { t } = useLocale();
@@ -142,7 +143,7 @@ async function onSave(): Promise<void> {
async function onDelete(): Promise<void> {
await securityUserService.Delete(routeId.value);
uni.showToast({ title: t("AdminPage.deletedTip"), icon: "none" });
setTimeout(() => uni.navigateBack(), 600);
setTimeout(() => smartBack("mineTab"), 600);
}
function onAction(action: AdminFormAction): void {
@@ -158,7 +159,7 @@ function onAction(action: AdminFormAction): void {
break;
case "cancel":
if (isNew.value || !routeId.value) {
uni.navigateBack();
smartBack("mineTab");
return;
}
readonly.value = true;
@@ -170,7 +171,7 @@ function onAction(action: AdminFormAction): void {
}
function onBack(): void {
uni.navigateBack();
smartBack("mineTab");
}
// 角色选择:跳 actor-enquiry(可多选),回传后按 ActorName 去重合并