深入D2-Admin:路由与权限管理系统详解
本文全面解析了D2-Admin框架的路由与权限管理系统,涵盖了Vue Router配置与路由拦截机制、多标签页管理与页面控制API、权限验证与登录状态管理、以及菜单系统与动态路由配置四个核心模块。文章详细介绍了路由的分层设计、动态导入优化、权限验证流程、多标签页的状态管理和数据持久化机制,为开发者提供了完整的企业级权限管理解决方案。
Vue Router配置与路由拦截机制
D2-Admin的路由系统采用了Vue Router作为核心路由管理工具,通过精心设计的配置结构和强大的路由拦截机制,实现了完整的权限控制和页面导航功能。本文将深入解析D2-Admin的路由配置体系和拦截机制实现原理。
路由配置结构
D2-Admin采用模块化的路由配置方式,将路由分为三个主要部分:
// 主框架内显示的路由
const frameIn = [
{
path: '/',
redirect: { name: 'index' },
component: layoutHeaderAside,
children: [...]
},
playground,
plugins,
components
]
// 主框架外显示的路由(如登录页)
const frameOut = [
{
path: '/login',
name: 'login',
component: _import('system/login')
}
]
// 错误页面路由
const errorPage = [
{
path: '*',
name: '404',
component: _import('system/error/404')
}
]
这种分层设计使得不同类型的路由能够被清晰地组织和维护,提高了代码的可读性和可维护性。
动态导入与性能优化
D2-Admin针对不同环境采用了差异化的组件加载策略,以优化开发和生产环境的性能:
// 根据环境变量选择不同的导入方式
const _import = require('@/libs/util.import.' + process.env.NODE_ENV)
// 路由配置中使用动态导入
{
path: 'index',
name: 'index',
meta: { title: '首页', auth: true },
component: _import('system/index') // 动态导入组件
}
这种设计解决了开发环境下热更新缓慢的问题,同时在生产环境中启用懒加载以优化首屏加载性能。
路由元信息与权限控制
每个路由都可以通过meta字段定义元信息,其中auth属性用于标识该路由是否需要登录验证:
{
path: 'index',
name: 'index',
meta: {
title: '首页',
auth: true // 需要登录验证
},
component: _import('system/index')
}
路由拦截机制实现
D2-Admin的核心路由拦截机制通过router.beforeEach全局前置守卫实现:
router.beforeEach(async (to, from, next) => {
// 确保多标签页数据和组件尺寸设置已加载
await store.dispatch('d2admin/page/isLoaded')
await store.dispatch('d2admin/size/isLoaded')
// 启动进度条
NProgress.start()
// 关闭搜索面板
store.commit('d2admin/search/set', false)
// 权限验证逻辑
if (to.matched.some(r => r.meta.auth)) {
const token = util.cookies.get('token')
if (token && token !== 'undefined') {
next() // 已登录,允许访问
} else {
// 未登录,重定向到登录页
next({
name: 'login',
query: { redirect: to.fullPath } // 携带原目标路径
})
NProgress.done()
}
} else {
next() // 无需验证,直接通过
}
})
路由后置处理
在路由导航完成后,系统会执行一系列后置处理操作:
router.afterEach(to => {
// 完成进度条
NProgress.done()
// 多页控制:打开新的页面
store.dispatch('d2admin/page/open', to)
// 更新页面标题
util.title(to.meta.title)
})
路由导航流程
D2-Admin的路由导航遵循以下完整流程:
flowchart TD
A[路由导航开始] --> B[加载必要数据]
B --> C[启动进度条NProgress]
C --> D[关闭搜索面板]
D --> E{需要权限验证?}
E -->|是| F{已登录?}
E -->|否| H[直接放行]
F -->|是| H
F -->|否| I[重定向到登录页]
I --> J[携带原目标路径]
J --> K[完成进度条]
K --> L[导航结束]
H --> M[路由组件加载]
M --> N[更新多标签页]
N --> O[设置页面标题]
O --> P[完成进度条]
P --> L
权限验证机制详解
D2-Admin的权限验证机制基于路由元信息和Cookie token的验证方式:
| 验证条件 | 处理方式 | 说明 |
|---|---|---|
meta.auth为true且token有效 |
允许访问 | 已登录用户访问受保护路由 |
meta.auth为true但token无效 |
重定向到登录页 | 未登录用户访问受保护路由 |
meta.auth为false或未定义 |
直接放行 | 公开路由无需验证 |
错误处理与重定向机制
系统提供了专门的错误页面和重定向路由来处理异常情况:
// 页面重定向路由
{
path: 'redirect/:route*',
name: 'redirect',
hidden: true,
component: _import('system/function/redirect')
}
// 404错误页面
{
path: '*',
name: '404',
component: _import('system/error/404')
}
路由配置最佳实践
在D2-Admin中配置路由时,建议遵循以下最佳实践:
- 模块化组织:将相关功能的路由组织在同一模块中
- 合理使用懒加载:对非首屏组件使用懒加载优化性能
- 明确的权限标识:为需要权限的路由正确设置
meta.auth属性 - 完整的元信息:为每个路由提供完整的
meta信息,包括标题等 - 错误处理:确保配置了404和其他错误处理路由
通过这种精心设计的路由配置和拦截机制,D2-Admin实现了灵活而强大的页面导航和权限控制功能,为开发者提供了完善的路由管理解决方案。
多标签页管理与页面控制API
D2-Admin的多标签页管理系统是其核心功能之一,提供了完整的页面生命周期管理和丰富的控制API。这套系统不仅支持基本的标签页打开、关闭操作,还实现了智能缓存管理、页面状态持久化、拖拽排序等高级功能,为复杂的企业级应用提供了强大的页面管理能力。
多标签页核心架构
D2-Admin的多标签页系统采用Vuex进行状态管理,通过模块化的设计实现了页面数据的集中存储和高效操作。整个系统由以下几个核心部分组成:
classDiagram
class PageStore {
+Array pool
+Array opened
+Boolean openedLoaded
+String current
+Array keepAlive
+isLoaded()
+openedLoad()
+opened2db()
+openedUpdate()
+openedSort()
+add()
+open()
+close()
+update()
+closeLeft()
+closeRight()
+closeOther()
}
class RouterSystem {
+Router router
+Object setting
+isKeepAlive()
}
class PersistenceLayer {
+dbName: "sys"
+path: "page.opened"
+user: true
}
PageStore --> RouterSystem : \u4f7f\u7528
PageStore --> PersistenceLayer : \u6570\u636e\u6301\u4e45\u5316
页面状态管理机制
多标签页的状态管理采用了Vuex的模块化设计,通过page.js模块集中管理所有页面相关的状态和操作:
// 页面状态数据结构
state: {
pool: [], // 支持多页显示的页面池
opened: [], // 当前打开的页面列表
openedLoaded: false, // 数据加载状态
current: '', // 当前激活的页面
keepAlive: [] // 需要缓存的页面列表
}
核心API功能详解
1. 页面打开与导航控制
D2-Admin提供了完整的页面打开机制,支持智能的路由匹配和页面状态管理:
// 打开新页面的核心方法
async open({ state, commit, dispatch }, { name, params, query, fullPath, meta }) {
const opened = state.opened
let pageOpendIndex = 0
const pageOpend = opened.find((page, index) => {
const same = page.fullPath === fullPath
pageOpendIndex = same ? index : pageOpendIndex
return same
})
if (pageOpend) {
// 更新已存在的页面
await dispatch('openedUpdate', { index: pageOpendIndex, params, query, fullPath })
} else {
// 添加新页面
const page = state.pool.find(t => t.name === name)
if (page) {
await dispatch('add', { tag: merge({}, page), params, query, fullPath })
}
}
// 设置缓存和当前页面
if (isKeepAlive({ meta })) commit('keepAlivePush', name)
commit('currentSet', fullPath)
}
2. 智能缓存管理
系统实现了基于页面元数据的自动缓存管理,确保用户体验的流畅性:
// 缓存判定函数
const isKeepAlive = data => get(data, 'meta.cache', false)
// 缓存刷新机制
keepAliveRefresh (state) {
state.keepAlive = state.opened
.filter(page => isKeepAlive(page))
.map(page => page.name)
.filter((name, index, self) => self.indexOf(name) === index)
}
3. 批量页面操作API
D2-Admin提供了丰富的批量操作功能,支持多种场景下的页面管理:
| API方法 | 功能描述 | 参数说明 | 使用场景 |
|---|---|---|---|
closeLeft |
关闭左侧所有标签页 | pageSelect可选参数 |
清理左侧无用页面 |
closeRight |
关闭右侧所有标签页 | pageSelect可选参数 |
清理右侧无用页面 |
closeOther |
关闭其他所有标签页 | pageSelect可选参数 |
专注于当前页面 |
openedSort |
拖拽排序页面 | {oldIndex, newIndex} |
自定义页面排列 |
// 关闭其他页面的实现
async closeOther({ state, commit, dispatch }, { pageSelect } = {}) {
const pageAim = pageSelect || state.current
let currentIndex = 0
state.opened.forEach((page, index) => {
if (page.fullPath === pageAim) currentIndex = index
})
for (let i = state.opened.length - 1; i >= 0; i--) {
if (state.opened[i].name === 'index' || currentIndex === i) continue
commit('keepAliveRemove', state.opened[i].name)
state.opened.splice(i, 1)
}
await dispatch('opened2db')
state.current = pageAim
if (router.app.$route.fullPath !== pageAim) await router.push(pageAim)
}
4. 数据持久化机制
多标签页状态支持多种持久化方式,确保用户刷新页面后能够恢复之前的工作状态:
// 数据持久化到本地存储
async opened2db({ state, dispatch }) {
dispatch('d2admin/db/set', {
dbName: 'sys',
path: 'page.opened',
value: state.opened,
user: true
}, { root: true })
}
// 从持久化数据加载
async openedLoad({ state, commit, dispatch }) {
const value = await dispatch('d2admin/db/get', {
dbName: 'sys',
path: 'page.opened',
defaultValue: setting.page.opened,
user: true
}, { root: true })
// 数据验证和过滤逻辑
const valid = []
state.opened = value.map(opened => {
if (opened.fullPath === '/index') {
valid.push(1)
return opened
}
const find = state.pool.find(item => item.name === opened.name)
valid.push(find ? 1 : 0)
return merge({}, opened, find)
}).filter((opened, index) => valid[index] === 1)
state.openedLoaded = true
commit('keepAliveRefresh')
}
高级功能特性
1. 页面生命周期管理
sequenceDiagram
participant User
participant Router
participant PageStore
participant CacheManager
User->>Router: \u70b9\u51fb\u83dc\u5355\u9879
Router->>PageStore: \u89e6\u53d1open\u65b9\u6cd5
PageStore->>PageStore: \u68c0\u67e5\u9875\u9762\u662f\u5426\u5df2\u5b58\u5728
alt \u9875\u9762\u5df2\u5b58\u5728
PageStore->>PageStore: \u66f4\u65b0\u9875\u9762\u72b6\u6001
else \u9875\u9762\u4e0d\u5b58\u5728
PageStore->>PageStore: \u6dfb\u52a0\u65b0\u9875\u9762
end
PageStore->>CacheManager: \u68c0\u67e5\u7f13\u5b58\u9700\u6c42
PageStore->>Router: \u5b8c\u6210\u5bfc\u822a
2. 智能路由匹配算法
系统实现了高效的路由匹配算法,确保页面状态的准确维护:
// 路由匹配逻辑
const pageOpend = opened.find((page, index) => {
const same = page.fullPath === fullPath
pageOpendIndex = same ? index : pageOpendIndex
return same
})
3. 内存优化与性能保障
通过智能的缓存管理和页面池机制,确保系统在高负载情况下的稳定运行:
// 缓存清理机制
keepAliveRemove (state, name) {
const index = state.keepAlive.findIndex(item => item === name)
if (index >= 0) state.keepAlive.splice(index, 1)
}
// 缓存添加机制
keepAlivePush (state, name) {
if (!state.keepAlive.includes(name)) state.keepAlive.push(name)
}
实际应用示例
1. 自定义页面控制
开发者可以通过Vuex的dispatch方法调用各种页面控制API:
// 在Vue组件中使用
export default {
methods: {
// 关闭当前页面
closeCurrentPage() {
this.$store.dispatch('d2admin/page/close', {
tagName: this.$route.fullPath
})
},
// 关闭其他页面
closeOtherPages() {
this.$store.dispatch('d2admin/page/closeOther')
},
// 更新页面标题
updatePageTitle(newTitle) {
this.$store.dispatch('d2admin/page/update', {
tagName: this.$route.fullPath,
title: newTitle
})
}
}
}
2. 批量操作场景
// 批量关闭页面的高级用法
async cleanupPages() {
// 关闭所有非首页的页面
const currentPages = this.$store.state.d2admin.page.opened
for (const page of currentPages) {
if (page.name !== 'index') {
await this.$store.dispatch('d2admin/page/close', {
tagName: page.fullPath
})
}
}
}
配置与自定义
D2-Admin的多标签页系统支持高度自定义,开发者可以通过修改配置文件来调整系统行为:
// setting.js 中的页面配置
page: {
opened: [
{
name: 'index',
fullPath: '/index',
meta: {
title: '首页',
auth: false
}
}
]
}
通过这套完善的多标签页管理系统,D2-Admin为企业级应用提供了稳定、高效、易用的页面管理解决方案,大大提升了开发效率和用户体验。
权限验证与登录状态管理
D2-Admin采用了一套完整的权限验证和登录状态管理机制,通过Vuex状态管理、路由守卫和Cookie存储的有机结合,实现了企业级应用的权限控制需求。本节将深入解析这套系统的实现原理和最佳实践。
登录状态验证机制
D2-Admin的权限验证基于路由级别的meta配置和全局前置守卫实现。系统通过检查路由元信息中的auth字段来判断是否需要登录验证:
// 路由配置示例
{
path: 'index',
name: 'index',
meta: {
title: '首页',
auth: true // 需要登录验证
},
component: _import('system/index')
}
在路由拦截器中,系统会检查当前路由是否需要认证:
router.beforeEach(async (to, from, next) => {
// 验证当前路由所有的匹配中是否需要有登录验证的
if (to.matched.some(r => r.meta.auth)) {
const token = util.cookies.get('token')
if (token && token !== 'undefined') {
next() // 已登录,允许访问
} else {
// 未登录,跳转到登录页并携带重定向路径
next({
name: 'login',
query: { redirect: to.fullPath }
})
}
} else {
next() // 无需认证,直接通过
}
})
登录流程与状态管理
登录过程涉及多个组件的协同工作,其完整流程如下:
sequenceDiagram
participant User
participant LoginComponent
participant AccountStore
participant API
participant Router
participant Cookies
User->>LoginComponent: 提交登录表单
LoginComponent->>AccountStore: dispatch('login', credentials)
AccountStore->>API: SYS_USER_LOGIN(username, password)
API-->>AccountStore: 返回token和用户信息
AccountStore->>Cookies: 设置uuid和token
AccountStore->>UserStore: 更新用户信息
AccountStore->>AccountStore: 加载持久化设置
AccountStore-->>LoginComponent: 登录成功
LoginComponent->>Router: 重定向到目标页面
登录成功后,系统会执行以下关键操作:
- Token存储:将用户token和uuid存储到Cookie中
- 用户信息更新:更新Vuex store中的用户状态
- 持久化加载:从本地存储加载用户的个性化设置
// 登录核心代码
async login({ dispatch }, { username, password }) {
const res = await SYS_USER_LOGIN({ username, password })
// 设置身份验证cookie
util.cookies.set('uuid', res.uuid)
util.cookies.set('token', res.token)
// 更新用户信息
await dispatch('d2admin/user/set', { name: res.name }, { root: true })
// 加载用户设置
await dispatch('load')
}
Cookie管理策略
D2-Admin使用版本化的Cookie命名策略,确保不同版本应用间的Cookie隔离:
| Cookie名称 | 用途 | 有效期 |
|---|---|---|
| d2admin-{version}-token | 身份验证令牌 | 1天 |
| d2admin-{version}-uuid | 用户唯一标识 | 1天 |
// Cookie工具类实现
cookies.set = function (name, value, cookieSetting = {}) {
const currentCookieSetting = { expires: 1 }
merge(currentCookieSetting, cookieSetting)
Cookies.set(`d2admin-${process.env.VUE_APP_VERSION}-${name}`, value, currentCookieSetting)
}
用户状态持久化
系统通过Vuex和本地存储的结合实现用户状态的持久化:
// 用户信息存储示例
async set({ state, dispatch }, info) {
// 更新Vuex状态
state.info = info
// 持久化到本地存储
await dispatch('d2admin/db/set', {
dbName: 'sys',
path: 'user.info',
value: info,
user: true // 区分用户存储
}, { root: true })
}
注销与状态清理
注销操作需要清理所有相关的状态信息:
async function logout() {
// 删除身份验证cookie
util.cookies.remove('token')
util.cookies.remove('uuid')
// 清空用户信息
await dispatch('d2admin/user/set', {}, { root: true })
// 跳转到登录页
router.push({ name: 'login' })
}
安全最佳实践
D2-Admin在权限验证方面遵循以下安全最佳实践:
- Token验证:所有需要认证的路由都通过token验证
- Cookie安全:使用版本前缀防止Cookie冲突
- 重定向安全:登录后重定向到之前访问的页面
- 状态同步:确保Vuex状态和本地存储的一致性
- 错误处理:完善的登录失败和token过期处理机制
扩展与自定义
开发者可以根据实际需求扩展权限系统:
// 自定义权限验证逻辑
router.beforeEach(async (to, from, next) => {
if (to.matched.some(r => r.meta.auth)) {
const token = util.cookies.get('token')
const userRole = store.state.d2admin.user.info.role
// 添加角色权限检查
if (token && hasPermission(userRole, to.meta.roles)) {
next()
} else {
next({ name: 'login', query: { redirect: to.fullPath } })
}
} else {
next()
}
})
通过这套完善的权限验证与登录状态管理系统,D2-Admin为企业级应用提供了可靠的身份认证基础,开发者可以在此基础上构建复杂的权限控制逻辑。
菜单系统与动态路由配置
D2-Admin的菜单系统与路由配置是其权限管理架构的核心组成部分,通过精心设计的模块化结构和灵活的配置机制,为开发者提供了强大的动态菜单和路由管理能力。
菜单数据结构与组织
D2-Admin采用分层级的菜单数据结构,支持无限嵌套的菜单层级。每个菜单项包含以下核心属性:
| 属性名 | 类型 | 说明 | 示例 |
|---|---|---|---|
path |
String | 路由路径 | /demo/components |
title |
String | 菜单显示标题 | 组件 |
icon |
String | 菜单图标 | puzzle-piece |
children |
Array | 子菜单数组 | [{ path: '/demo/components/index', title: '扩展组件' }] |
菜单数据在 src/menu/ 目录下进行模块化管理:
// src/menu/index.js
export const menuAside = supplementPath([
demoComponents,
demoPlugins,
demoPlayground
])
export const menuHeader = supplementPath([
{
path: '/index',
title: '首页',
icon: 'home'
},
demoPlayground,
demoComponents,
demoPlugins
])
路由配置架构
路由系统采用模块化设计,与菜单系统保持高度一致性。路由配置分为三个主要部分:
graph TB
A[路由配置] --> B[框架内路由 frameIn]
A --> C[框架外路由 frameOut]
A --> D[错误页面路由 errorPage]
B --> B1[主布局组件]
B1 --> B2[首页路由]
B1 --> B3[功能模块路由]
B1 --> B4[系统路由]
C --> C1[登录页面]
D --> D1[404页面]
动态路由加载机制
D2-Admin支持生产环境的懒加载机制,通过环境变量控制加载策略:
// 由于懒加载页面太多的话会造成webpack热更新太慢,
// 所以开发环境不使用懒加载,只有生产环境使用懒加载
const _import = require('@/libs/util.import.' + process.env.NODE_ENV)
export default {
path: '/demo/components',
component: layoutHeaderAside,
children: [
{
path: 'container/full',
component: _import('demo/components/container/full.vue'),
meta: { title: '布局组件 填充', auth: true }
}
]
}
权限验证流程
路由系统内置完整的权限验证机制,通过路由守卫实现访问控制:
sequenceDiagram
participant User as 用户
participant Router as 路由守卫
participant Store as Vuex Store
participant Login as 登录页面
User->>Router: 访问需要认证的路由
Router->>Store: 检查用户认证状态
alt 已认证
Store-->>Router: 认证通过
Router-->>User: 允许访问
else 未认证
Store-->>Router: 认证失败
Router->>Login: 重定向到登录页
Login-->>User: 显示登录界面
end
具体的权限验证逻辑在路由守卫中实现:
router.beforeEach(async (to, from, next) => {
// 验证当前路由所有的匹配中是否需要有登录验证的
if (to.matched.some(r => r.meta.auth)) {
const token = util.cookies.get('token')
if (token && token !== 'undefined') {
next()
} else {
next({
name: 'login',
query: { redirect: to.fullPath }
})
}
} else {
next()
}
})
菜单与路由的关联映射
D2-Admin通过路径映射实现菜单与路由的自动关联:
flowchart LR
M[菜单配置] -->|path 属性| R[路由配置]
R -->|meta.title| M
M -->|icon 配置| UI[用户界面]
R -->|component 配置| UI
subgraph MenuModule
direction TB
M1[菜单项 path: '/demo/components']
M2[子菜单 path: '/demo/components/index']
end
subgraph RouteModule
direction TB
R1[路由 path: '/demo/components']
R2[子路由 path: 'index']
end
M1 --> R1
M2 --> R2
状态管理与持久化
菜单状态通过Vuex进行集中管理,并支持本地持久化存储:
// src/store/modules/d2admin/modules/menu.js
export default {
state: {
header: [], // 顶栏菜单
aside: [], // 侧栏菜单
asideCollapse: false, // 侧边栏收缩状态
asideTransition: true // 侧边栏折叠动画
},
actions: {
// 持久化侧边栏设置
async asideLoad({ state, dispatch }) {
const menu = await dispatch('d2admin/db/get', {
dbName: 'sys',
path: 'menu',
defaultValue: setting.menu,
user: true
}, { root: true })
state.asideCollapse = menu.asideCollapse
state.asideTransition = menu.asideTransition
}
}
}
高级配置特性
1. 多语言支持
菜单标题支持国际化配置,通过Vue I18n实现多语言切换。
2. 图标系统
支持多种图标类型:
- FontAwesome图标
- SVG图标
- 自定义图标选择器
3. 外部链接菜单
支持配置外部链接菜单项,点击后在新的浏览器标签页打开。
4. 菜单搜索功能
提供全局菜单搜索功能,支持快捷键操作。
最佳实践建议
-
模块化组织:按照功能模块划分菜单和路由配置,保持结构清晰。
-
权限粒度控制:利用路由的
meta.auth属性精细控制访问权限。 -
懒加载优化:在生产环境使用路由懒加载,提升应用性能。
-
状态持久化:重要菜单状态应进行持久化存储,提升用户体验。
-
统一命名规范:保持菜单路径和路由路径的一致性,便于维护。
通过这套完善的菜单和路由管理系统,D2-Admin为开发者提供了灵活而强大的权限控制能力,能够满足各种复杂的企业级应用场景需求。
D2-Admin的路由与权限管理系统通过模块化设计和精细的状态管理,实现了强大的页面导航和权限控制功能。系统采用Vue Router作为核心路由管理工具,结合Vuex状态管理和本地持久化存储,提供了完整的路由拦截、多标签页管理、权限验证和动态菜单配置能力。通过精心设计的架构和丰富的API,D2-Admin为开发者提供了灵活、可靠的企业级应用基础框架,能够满足各种复杂的业务场景需求。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00