{"id":31970661,"url":"https://github.com/winjs-dev/winjs-plugin-access","last_synced_at":"2025-10-14T19:18:04.587Z","repository":{"id":309310694,"uuid":"1035407005","full_name":"winjs-dev/winjs-plugin-access","owner":"winjs-dev","description":"A WinJS plugin that provides permission control for page resources.","archived":false,"fork":false,"pushed_at":"2025-10-01T18:54:37.000Z","size":420,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-01T20:40:15.386Z","etag":null,"topics":["access-control","plugins","winjs"],"latest_commit_sha":null,"homepage":"https://winjs-dev.github.io/winjs-docs/plugins/access","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/winjs-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-10T10:31:25.000Z","updated_at":"2025-09-16T01:31:43.000Z","dependencies_parsed_at":"2025-09-10T21:21:01.336Z","dependency_job_id":"d730e239-343b-428a-8912-e526d145bea8","html_url":"https://github.com/winjs-dev/winjs-plugin-access","commit_stats":null,"previous_names":["winjs-dev/winjs-plugin-access"],"tags_count":2,"template":false,"template_full_name":"winjs-dev/winjs-plugin-template","purl":"pkg:github/winjs-dev/winjs-plugin-access","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winjs-dev%2Fwinjs-plugin-access","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winjs-dev%2Fwinjs-plugin-access/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winjs-dev%2Fwinjs-plugin-access/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winjs-dev%2Fwinjs-plugin-access/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/winjs-dev","download_url":"https://codeload.github.com/winjs-dev/winjs-plugin-access/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winjs-dev%2Fwinjs-plugin-access/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279020655,"owners_count":26086895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access-control","plugins","winjs"],"created_at":"2025-10-14T19:18:03.303Z","updated_at":"2025-10-14T19:18:04.582Z","avatar_url":"https://github.com/winjs-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @winner-fed/plugin-access\n\n适配 access（权限）的 WinJS 插件，适用于 Vue3。\n\n\u003cp\u003e\n  \u003ca href=\"https://npmjs.com/package/@winner-fed/plugin-access\"\u003e\n   \u003cimg src=\"https://img.shields.io/npm/v/@winner-fed/plugin-access?style=flat-square\u0026colorA=564341\u0026colorB=EDED91\" alt=\"npm version\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square\u0026colorA=564341\u0026colorB=EDED91\" alt=\"license\" /\u003e\n  \u003ca href=\"https://npmcharts.com/compare/@winner-fed/plugin-access?minimal=true\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/@winner-fed/plugin-access.svg?style=flat-square\u0026colorA=564341\u0026colorB=EDED91\" alt=\"downloads\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## 功能特性\n\n- 🔐 基于角色的权限管理系统 (RBAC)\n- 🚀 支持动态设置角色和权限\n- 🛡️ 提供路由级别的权限控制\n- 🎯 提供组件级别的权限控制（指令和组件）\n- ⚡ 支持同步和异步权限检查\n- 🔍 支持路径模式匹配（支持通配符）\n- 📦 开箱即用，零配置启动\n- 🔧 可配置的权限控制处理器\n\n## 安装\n\n```bash\nnpm install @winner-fed/plugin-access\n```\n\n## 基本配置\n\n在 `.winrc.ts` 中配置插件：\n\n```typescript\nimport { defineConfig } from 'win';\n\nexport default defineConfig({\n  plugins: [require.resolve('@winner-fed/plugin-access')],\n  access: {\n    roles: {\n      admin: ['/', '/admin', '/users/*'],\n      normal: ['/normal', '/profile'],\n      guest: ['/login', '/register']\n    }\n  }\n});\n```\n\n## 使用方法\n\n### 1. 路由配置\n\n```typescript\n// src/app.ts\nimport { access as accessApi } from 'winjs';\n\n// 设置默认角色\naccessApi.setRole('admin');\n\nexport const access = {\n  noFoundHandler({ next }) {\n    // 处理404页面\n    const accessIds = accessApi.getAccess();\n    if (!accessIds.includes('/404')) {\n      accessApi.setAccess(accessIds.concat(['/404']));\n    }\n    next('/404');\n  },\n  unAccessHandler({ next }) {\n    // 处理无权限访问\n    next('/403');\n  },\n  ignoreAccess: ['/login', '/register'] // 忽略权限检查的路由\n};\n```\n\n### 2. 组件中使用\n\n#### 使用 v-access 指令\n\n```vue\n\u003ctemplate\u003e\n  \u003cdiv\u003e\n    \u003c!-- 只有有权限的用户才能看到 --\u003e\n    \u003cdiv v-access=\"'/admin'\"\u003e管理员内容\u003c/div\u003e\n    \n    \u003c!-- 支持动态权限 --\u003e\n    \u003cdiv v-access=\"dynamicPath\"\u003e动态内容\u003c/div\u003e\n    \n    \u003c!-- 支持通配符 --\u003e\n    \u003cdiv v-access=\"'/users/*'\"\u003e用户管理\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/template\u003e\n\n\u003cscript setup\u003e\nimport { ref } from 'vue';\n\nconst dynamicPath = ref('/profile');\n\u003c/script\u003e\n```\n\n#### 使用 Access 组件\n\n```vue\n\u003ctemplate\u003e\n  \u003cdiv\u003e\n    \u003cAccess id=\"/admin\"\u003e\n      \u003ctemplate #default\u003e\n        \u003cdiv\u003e管理员专用功能\u003c/div\u003e\n      \u003c/template\u003e\n    \u003c/Access\u003e\n  \u003c/div\u003e\n\u003c/template\u003e\n```\n\n#### 使用 useAccess Hook\n\n```vue\n\u003ctemplate\u003e\n  \u003cdiv\u003e\n    \u003cdiv v-if=\"hasAdminAccess\"\u003e管理员功能\u003c/div\u003e\n    \u003cdiv v-if=\"hasUserAccess\"\u003e用户功能\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/template\u003e\n\n\u003cscript setup\u003e\nimport { useAccess } from 'winjs';\n\nconst hasAdminAccess = useAccess('/admin');\nconst hasUserAccess = useAccess('/users/*');\n\u003c/script\u003e\n```\n\n### 3. 编程式权限控制\n\n```typescript\nimport { access } from 'winjs';\n\n// 设置角色\naccess.setRole('admin');\n\n// 设置权限\naccess.setAccess(['/admin', '/users']);\n\n// 检查权限（异步）\nconst hasAccess = await access.hasAccess('/admin');\n\n// 检查权限（同步）\nconst hasAccessSync = access.hasAccessSync('/admin');\n\n// 获取当前角色\nconst currentRole = access.getRole();\n\n// 获取当前权限列表\nconst currentAccess = access.getAccess();\n\n// 路径匹配\nconst isMatch = access.match('/users/profile', ['/users/*']);\n\n// 设置预设权限\naccess.setPresetAccess(['/public', '/common']);\n```\n\n## API 文档\n\n### 配置项\n\n#### access.roles\n- 类型：`Record\u003cstring, string[]\u003e`\n- 描述：角色与权限的映射关系\n\n#### access.noFoundHandler\n- 类型：`(params: { router, to, from, next }) =\u003e void`\n- 描述：404页面处理函数\n\n#### access.unAccessHandler\n- 类型：`(params: { router, to, from, next }) =\u003e void`\n- 描述：无权限访问处理函数\n\n#### access.ignoreAccess\n- 类型：`string[]`\n- 描述：忽略权限检查的路由列表\n\n### Access 对象方法\n\n#### setRole(roleId: string | Promise\u003cstring\u003e)\n设置当前用户角色。\n\n#### getRole(): string\n获取当前用户角色。\n\n#### setAccess(accessIds: string[] | Promise\u003cstring[]\u003e)\n设置当前用户权限列表。\n\n#### getAccess(): string[]\n获取当前用户权限列表。\n\n#### hasAccess(path: string): Promise\u003cboolean\u003e\n异步检查是否有指定路径的权限。\n\n#### hasAccessSync(path: string): boolean\n同步检查是否有指定路径的权限。\n\n#### match(path: string, accessIds: string[]): boolean\n检查路径是否匹配权限列表。\n\n#### setPresetAccess(accessIds: string | string[])\n设置预设权限。\n\n#### isDataReady(): boolean\n检查权限数据是否准备就绪。\n\n### useAccess Hook\n\n```typescript\nconst hasAccess = useAccess(path: string | Ref\u003cstring\u003e): Ref\u003cboolean\u003e\n```\n\n返回一个响应式的权限状态。\n\n## 高级用法\n\n### 1. 异步权限设置\n\n```typescript\nimport { access } from 'winjs';\n\n// 异步设置角色\naccess.setRole(fetch('/api/user/role').then(res =\u003e res.json()));\n\n// 异步设置权限\naccess.setAccess(fetch('/api/user/permissions').then(res =\u003e res.json()));\n```\n\n### 2. 动态权限更新\n\n```typescript\nimport { access } from 'winjs';\n\n// 用户登录后更新权限\nfunction onLogin(userInfo) {\n  access.setRole(userInfo.role);\n  access.setAccess(userInfo.permissions);\n}\n\n// 用户登出后清空权限\nfunction onLogout() {\n  access.setRole('guest');\n  access.setAccess([]);\n}\n```\n\n### 3. 权限通配符\n\n支持以下通配符模式：\n- `/users/*` - 匹配 `/users/` 下的所有路径\n- `/admin/*/edit` - 匹配 `/admin/任意内容/edit` 格式的路径\n\n### 4. 权限组合\n\n```typescript\n// 预设权限 + 角色权限 + 动态权限\naccess.setPresetAccess(['/public', '/common']);\naccess.setRole('admin'); // 自动获取 admin 对应的权限\naccess.setAccess(['/special']); // 额外的动态权限\n```\n\n## 许可证\n\n[MIT](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinjs-dev%2Fwinjs-plugin-access","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwinjs-dev%2Fwinjs-plugin-access","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinjs-dev%2Fwinjs-plugin-access/lists"}