标签 Vue 下的文章

一、概述总结

小店神器招商版是一款专为微信小商店生态设计的集群管理SaaS系统,解决传统单店运营模式效率低、货源渠道单一、管理成本高等痛点。系统通过"云仓+本地仓"双模式供应链体系,实现一键批量管理数千个小商店、跨平台商品搬家、自动结算分账等核心功能,帮助创业者快速搭建本地化商品聚合分销平台。

作为微擎生态下的多开版本,系统支持同时对接不同微信开放平台授权,适配视频号直播带货场景。上线两个月历经50+次迭代,服务100+客户保持零退款率,成为小商店批量化运营领域的标杆解决方案。


二、功能介绍

  1. 多店铺集群管理
  • 批量授权管理:一个后台统一管理1000+小商店授权
  • 跨平台搬家:支持拼多多、淘宝、天猫、1688商品一键搬家上架
  • 店铺复制:完整复制A店铺商品至B店铺,实现快速铺货
  • 商品云分发:总店商品一键同步至所有授权分销小店
  1. 智慧云仓系统
  • 百万货源直供:接入京东、1688优质商户,享受批发价优势(例:京东价24.9元商品,云仓价4.0元)
  • 自动发货同步:订单自动生成、云仓发货、物流信息实时同步至小商店
  • 零库存风险:支持一件代发模式,小店专注销售无需囤货
  1. 本地化货源市场
  • 同城商户聚合:优选本地服装店、五金店、建材店等实体店商品进入货源市场
  • 双向赋能:供应商获分销渠道,小店获独家低价货源
  • 灵活收费:可向供应商收取商品上架费(500元/件起),创造额外收益
  1. 智能订单与财务管理
  • 订单溯源:自动分析订单货品来源,智能提示采购渠道
  • 自动结算:小店销售收益自动统计,供应商货款自动提现
  • 预存款体系:小店入驻需缴纳预存款(1000元起),快速沉淀平台资金
  1. 营销与运营支持
  • 视频号直播带货:深度适配微信视频号生态,无缝衔接直播场景
  • 会员体系:支持VIP会员分级,差异化服务
  • 培训赋能:定期组织达人培训,提供运营指导

三、适用场景与行业价值

适用场景

场景类型 具体应用 核心价值

总店-分店模式 连锁品牌总部统管商品,分店独立销售 统一管理、品牌一致性、数据集中化

微商分销升级 将微商团队转化为正规小商店矩阵 合规化运营、自动化分佣、提升效率

实体店数字化转型 本地商家入驻平台,拓展线上销售渠道 低门槛触网、共享流量、一件代发

达人/主播带货 为带货主播提供专属小商店和稳定货源 私域沉淀、利润更高、体验闭环

行业价值

对平台运营方:

  • 轻资产创业:单台2M服务器即可启动,月成本仅100+
  • 多重盈利:系统使用费(150元/店/年)+上架费+销售差价+预存款沉淀
  • 蓝海市场:本地化电商渗透率不足5%,竞争少增长空间大
  • 可持续收益:前期搭建渠道,后期实现"睡后收入"

对供应商:

  • 渠道裂变:一件商品瞬间铺向千店,销量指数级增长
  • 资金高效:订单产生后发货,无需账期压力
  • 私域保护:发展专属带货小店,客户资源不流失

对小店/达人:

  • 零门槛开店:无需美工技术,一键上货即可运营
  • 货源优势:云仓批发价+本地独家货源,利润空间更大
  • 全程托管:订单、物流、售后自动化处理,专注前端销售

四、常见问题Q&A

Q1:已经有微信小商店服务商后台,为什么还要用这个系统?

A:小店神器不是简单上架工具,而是一整套运营解决方案。服务商后台功能模块需单独购买(如商品管理与订单权限分离),定价策略受限。本系统功能闭环、利润模式更灵活,支持自建供应链体系,是真正可独立运营的商业平台。

Q2:系统部署复杂吗?需要准备哪些资源?

A:标准部署需准备:①服务器(2M带宽即可)②微擎框架系统 ③认证服务号(收款用)④微信开放平台(用于店铺授权)。配置涉及Python+Vue+开放平台接口,技术门槛较高,但提供付费代配置服务和24小时技术支持,1-3天可完成搭建。

Q3:云仓和本地仓有什么区别?我应该如何选择?

A:云仓是系统内置的百万级共享货源(京东、1688),无需预存即可一件代发,适合快速启动;本地仓是您自主搭建的私有供应链,整合同城商家货源,可收取上架费并掌握独家资源。建议初期用云仓跑通模式,稳定后发展本地仓建立竞争壁垒。

Q4:平台如何盈利?有哪些收入点?

A:核心盈利模式包括:①系统使用费(150元/店/年)②供应商商品上架费(500元/件起)③销售利润差价(5-10%)④小店预存款资金沉淀(100店×1000元=10万)⑤VIP会员费、提现手续费等。云仓模式下,差价和预存款是最主要收入来源。

Q5:货源市场的商品质量如何保证?售后怎么办?

A:货源市场商品均来自您审核入驻的供应商或云仓认证商家。建议建立供应商准入机制和保证金制度。订单售后由实际发货方(供应商或云仓)承担,系统提供售后工单流转功能,平台作为监管方协调处理。

Q6:这个项目多久能盈利?适合什么样的人做?

A:项目设计为"半年积累,持续收益"的长期模式。适合能扎根本地市场、有商家拓展能力、寻求3年以上稳定项目的创业者。不适合追求短期暴利的投机者。目前已有100+客户验证,配合云仓可大幅缩短盈利周期。

Q7:系统后续升级和技术支持如何保障?

A:团队保持每月20+次迭代速度,紧急问题24小时响应。购买后加入全国运营者社群,与各地大佬交流经验。老客户享8折优惠和优先内测权。承诺持续跟进微信官方接口升级,确保系统长期稳定。

Q8:可以独立部署或二次开发吗?

A:本系统为微擎模块单开版,不支持多开或独立部署用于商业化销售。如有定制化需求(如上架至微信服务市场)可联系团队定制开发,费用较高。建议先运营现有系统验证模式,再考虑品牌定制化。

前端开发者常常面临这样的困境:Vue项目需要使用React生态的优秀组件,或者React项目想引入Vue的优雅解决方案。过去,这几乎意味着需要完全重写或寻找笨重的替代方案。

今天介绍的Veaury将彻底改变这一局面。这是一个专门设计用于在Vue和React之间实现无缝互操作的工具库。

核心问题与挑战

在实际开发中,跨框架组件复用面临诸多挑战:

  1. 上下文隔离:Vue和React有各自独立的上下文系统,数据传递困难
  2. 生命周期不匹配:两个框架的生命周期模型完全不同
  3. 事件系统差异:Vue使用自定义事件,React使用合成事件
  4. 渲染机制不同:Vue基于模板,React基于JSX

Veaury的技术实现原理

Veaury通过高阶组件(HOC)的方式,在两种框架之间搭建桥梁。其核心思路是:

// 简化版实现原理示意
function createCrossFrameworkWrapper(OriginalComponent, targetFramework) {
  return function Wrapper(props, context) {
    // 处理props转换
    const convertedProps = convertProps(props, targetFramework);
    
    // 处理上下文传递
    const frameworkContext = adaptContext(context, targetFramework);
    
    // 根据目标框架选择渲染方式
    if (targetFramework === 'vue') {
      return renderAsVue(OriginalComponent, convertedProps, frameworkContext);
    } else {
      return renderAsReact(OriginalComponent, convertedProps, frameworkContext);
    }
  };
}

主要特性

1. 完整的Vue 3支持

  • 支持Composition API和Options API
  • 支持Teleport、Suspense等Vue 3特性
  • 完整的响应式系统集成

2. 双向上下文共享

// React组件可以访问Vue的provide/inject
// Vue组件可以访问React的Context
const SharedComponent = ({ theme }) => {
  // theme可以来自Vue的provide或React的Context
  return <div className={`theme-${theme}`}>共享主题</div>;
};

3. 纯模式(Pure Mode)

消除包装器带来的额外DOM元素,保持组件树的整洁:

// 使用纯模式包装
const PureReactComponent = applyPureReactInVue(ReactComponent);
// 渲染结果没有额外的div包裹

4. 生命周期映射

Veaury智能地映射两个框架的生命周期:

Vue 生命周期React 等效
onMounteduseEffect(() => {}, [])
onUpdateduseEffect(() => {})
onUnmounteduseEffect(() => () => {})

实际应用示例

场景一:在Vue项目中使用React组件

<template>
  <div>
    <h2>Vue组件主体</h2>
    <!-- 直接使用React组件 -->
    <ReactDataTable :data="tableData" @row-click="handleRowClick" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { applyPureReactInVue } from 'veaury';
import ReactDataTable from './ReactDataTable.jsx';

// 将React组件转换为Vue可用的组件
const ReactDataTable = applyPureReactInVue(ReactDataTable);

const tableData = ref([
  { id: 1, name: '项目A', value: 100 },
  { id: 2, name: '项目B', value: 200 }
]);

const handleRowClick = (rowData) => {
  console.log('行点击事件:', rowData);
  // 处理来自React组件的事件
};
</script>

场景二:在React项目中使用Vue组件

import React, { useState } from 'react';
import { applyVueInReact } from 'veaury';
import VueRichEditor from './VueRichEditor.vue';

const RichEditor = applyVueInReact(VueRichEditor);

function App() {
  const [content, setContent] = useState('');
  const [isDarkMode, setIsDarkMode] = useState(false);

  const handleContentChange = (newContent) => {
    setContent(newContent);
    // 处理来自Vue组件的事件
  };

  return (
    <div className={isDarkMode ? 'dark-theme' : 'light-theme'}>
      <h1>React应用中的Vue富文本编辑器</h1>
      <RichEditor
        modelValue={content}
        onUpdate:modelValue={handleContentChange}
        darkMode={isDarkMode}
        v-slots={{
          toolbar: () => <div>自定义工具栏</div>
        }}
      />
      <button onClick={() => setIsDarkMode(!isDarkMode)}>
        切换主题
      </button>
    </div>
  );
}

性能考虑

Veaury在性能方面做了大量优化:

  1. 最小化重渲染:通过精细的响应式侦听,避免不必要的重新渲染
  2. 内存效率:合理管理组件实例,避免内存泄漏
  3. 构建优化:支持Tree-shaking,只引入需要的功能

性能对比示例:

// 传统iframe方案 vs Veaury方案
// iframe:独立的DOM、样式和上下文,开销大
// Veaury:共享同一DOM,轻量级包装,性能接近原生

企业级应用实践

案例:低代码平台集成

某低代码平台使用Veaury实现插件系统:

  • 核心框架:Vue 3 + TypeScript
  • 插件生态:支持React和Vue两种插件
  • 实现效果:开发者可使用任意框架开发插件

案例:微前端架构

在微前端场景中,Veaury帮助不同技术栈的子应用共享组件:

// 主应用(Vue)使用子应用(React)的组件库
import { applyPureReactInVue } from 'veaury';
import ReactDesignSystem from 'team-react-ds';

// 在Vue主应用中直接使用React设计系统
const VueWrappedButton = applyPureReactInVue(ReactDesignSystem.Button);
const VueWrappedModal = applyPureReactInVue(ReactDesignSystem.Modal);

配置与构建

Vite配置示例

// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import veauryVitePlugins from 'veaury/vite';

export default defineConfig({
  plugins: [
    veauryVitePlugins({
      type: 'vue', // 或 'react',根据主框架选择
      vueOptions: {
        reactivityTransform: true // 启用响应式语法糖
      }
    })
  ],
  optimizeDeps: {
    include: ['veaury']
  }
});

Webpack配置要点

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: 'vue-loader'
      },
      {
        test: /\.jsx$/,
        use: 'babel-loader',
        options: {
          presets: ['@babel/preset-react']
        }
      }
    ]
  }
};

局限性说明

尽管Veaury功能强大,但仍有一些限制:

  1. 部分高级特性:某些框架特定的高级特性可能不完全支持
  2. 开发体验:调试时需要了解两种框架
  3. 学习成本:团队需要同时熟悉Vue和React

总结

对于需要在Vue和React之间搭建桥梁的项目,Veaury提供了一个成熟、稳定的解决方案。无论是新项目技术选型,还是老项目现代化改造,都值得考虑这一工具。

技术栈不应成为创新的约束,而应是实现目标的工具。 Veaury正是这一理念的实践,让开发者能够专注于创造价值,而不是被框架之争所困扰。

本文由mdnice多平台发布

因为 AI 已经彻底改变了我写代码、做产品的方式。

举个最近非常真实的例子:
我用 AI 从收集资料、买域名、写代码,到上线一个可访问的网站,全程不到 1 个小时https://openclawai.net/

这个速度,说实话,用 Vue 是几乎做不到的,而且我更加熟悉 vue 。

不是 Vue 不好,而是:各个平台默认输出的就是 react ,如果迁移到 vue 需要很多额外的 token

而用 AI 写 React:

  • JSX + 函数组件,AI 命中率非常高
  • 一次生成可运行的概率明显更大
  • 重构、拆组件、补逻辑几乎是“指哪打哪”

更关键的一点是:
我对 React 其实并不算熟。

但这件事已经不再重要了。

作者介绍

苏国庆

资深审计内控专家 | 全栈架构师

Oinone Codelab 开源组织 核心用户

行业领先内控审计公司技术负责人,10 年+ 行业深耕,拥有从架构设计至业务落地的全链路闭环能力。

精通全栈开发与数据治理,在复杂数据采集及深度分析领域造诣深厚,擅长攻克高难度业务数据挑战。

在国家大力推进教育治理体系和治理能力现代化的背景下,财政部、教育部联合发布《关于进一步加强高等学校内部控制建设的指导意见》(财会〔2024〕16号),明确提出到2026年基本建成制度健全、权责清晰、制衡有力、运行有效、风险可控、监督到位的高校内部控制体系。

如何让内部控制体系实际融入单位业务并服务于单位治理,让风险可监测、可跟踪、可预警、可纠偏,成为现实难题。以此为驱动,河南中审科技有限公司依托数式Oinone低代码平台,成功打造了面向各级院校的“院校内部控制数智化服务平台”,以真实业务场景为载体,探索出了一条“用内控规则驱动业务、用数据支撑治理”的可落地路径。不仅响应了国家对高校治理能力提升的战略要求,更充分展现了Oinone作为企业级产品化引擎在复杂业务场景中的强大支撑能力。

政策驱动内部控制成为单位治理能力提升的重要抓手

近年来,国家层面持续释放明确信号:

第十四届全国人大常委会第十次会议表决通过《关于修改(中华人民共和国会计法)的决定》,首次将内部控制写入会计法,明确提出“各单位应当建立、健全本单位内部会计监督制度,并中华人民共和闻会计法纳入本单位内部控制制度”,为各单位开展内部控制评价工作提供了坚实的法律保障。

2023年2月8日,中共中央办公厅、国务院办公厅印发了《关于进一步加强财会监督工作的意见》,并发出通知,要求各地区各部结合实际认真贯彻落实。其中,《意见》从5个方面明确要求完善“内部控制”:

图片

尤其是在高校领域,财政部、教育部最新文件明确要求:

规范债务管理,加强对外合作管理,强化科研管理,加强财政专项项目管理,规范非学历教育办学行为,强化所属企业管理,规范附属单位和校内独立核算单位管理,加强教育基“6+N"金会管理。全面提升高等学校内部控制的信息管理水平。

到2026年,基本建立制度健全、权责清晰、制衡有力、运行有效、风险可控、监督到位的内部控制体系。

图片

充分发挥高等学校党委在内部控制建设中的领导作用,内部控制相关重要议题应提请党委决策审议。明确高等学校校长是内部控制建设和实施工作的首要责任人明确学校领导班子其他成员是各自分管领域内部控制建设与实施的负责人。内部控制工作应纳入高等学校领导班子年度履职清单。

现实痛点为什么“有内控,却防不住风险”

在大量高校实践中,我们发现几个高度共性的难题:

图片

1.建设成效与预期存在偏差

· 建设成果与单位业务不匹配未达建设预期成效;

· 未将内部控制融入单位业务流程业务覆盖不全面;

· 未形成对单位治理的支撑作用无法充分发挥管控效能;

2.传统建设方法无法满足新要求

· 传统内控建设方法耗费工时多、质量低、效果差;

· 需采购第三方服务与过“紧日子”的要求不符合;

· 对人员专业能力和经验依赖性高无法确保内控建设质量和效果;

3.风险管控响应滞后

· 传统模式依赖人工排查风险管控响应存在滞后;

· 人工识别易出现风险遗漏判断结果存在偏差;

· 风险管控以事后补救整改为主事前防控不足;

这些问题的本质在于:内控规则没有进入业务系统“跑起来”。

关键支撑数式 Oinone 平台让内控数字化、数智化、数治化

高校内控系统对平台能力要求高:业务复杂、规则多、变化快、国产化要求严格。

数式Oinone在本项目中,成为内控数智化真正落地的关键底座。基于内部控制体系成果构建内控规则库,形成单位管控的业务底座,实现内部控制数字化;通过内部控制形成基于规则前置的经济业务的全流程应用,实现内部控制数智化;基于内控规则对业务过程深度分析,让数据话说,挖掘潜在风险,织密廉政风险防范网,实现内部控制数治化。

1.数据驱动:平台级能力的统一建模与演进基础

数式Oinone以元数据驱动作为平台的底层设计理念,将应用中的模型、页面、流程、权限、集成关系等共性要素统一抽象为可管理的元数据对象,使系统具备:

· 可建模:核心业务要素在平台层面形成统一描述,而不是分散在各类实现代码中;

· 可复用:已沉淀的模型结构、交互模式和流程能力可在不同应用、不同项目中复用;

· 可演进:通过元数据的差量管理和版本管理机制,支撑产品持续迭代和升级;

基于这一能力,平台实现了产品结构与实现逻辑的解耦,为复杂业务系统的长期演进、模块扩展和规模化交付提供了稳定而可持续的技术基础。

图片

2.低无一体:效率与灵活兼得

面对高校差异化管理需求,又可通过Java / Vue原生代码深度扩展,实现了真正的 “低无一体”开发模式,既快,又不受限。

图片

3.复杂流程建模能力,匹配真实内控场景

Oinone原生支持复杂流程引擎,使内控规则能够完整嵌入真实业务流转,而非简单审批。

图片

4.标品与个性化共存,支撑规模化复制

· 内控核心能力被沉淀为标准产品;

· 学校个性化规则以扩展包方式实现;

· 标品可持续升级,个性化不被覆盖;

图片

Oinone“产品化引擎”的能力解决了:项目能交付,产品却难迭代的行业共性难题。

5.国产化全栈支持,满足政务要求

平台全面适配:国产操作系统、国产数据库、国产中间件。

图片

落地成效内控从“制度约束”走向“治理工具”

基于 Oinone 平台构建的内控系统,在高校实际应用中,实现了:

✅ 规则前置

制度要求自动融入业务,不符合规则的操作即时提示或限制。

✅ 风险可视

预算执行、项目进度、合同履约、资产变动等 全流程可回溯。

✅ 管理闭环

问题发现 → 预警 → 整改 → 留痕,全程留痕可追溯。

✅ 治理升级

内部控制体系成果成为单位治理的“业务底座”

Oinone 平台成为单位治理的“技术底座”;

内部控制执行过程成为单位治理的“数据底座”;

“业务底座”+“技术底座”+“数据底座”促进单位治理能力进阶升级。

用Oinone,让专业能力变成可复制的产品

高校内控数智化实践证明:

优秀的平台,能够让复杂制度变得可运行,让专业能力变得可复制。

数式Oinone并不仅是一个低代码工具,而是一个面向软件公司的企业级产品化引擎:

· 帮助软件企业沉淀行业能力;

· 支撑标准产品与个性化交付并行;

· 让“项目经验”真正升级为“产品能力”。

而基于 Oinone 打造的内控数智化平台,也正在成为高校治理现代化进程中的重要数字基础设施。

前言

本篇文章主要讲解 RBAC 权限方案在中后台管理系统的实现

在公司内部写过好几个后台系统,都需要实现权限控制,在职时工作繁多,没有系统性的来总结一下相关经验,现在人已离职,就把自己的经验总结一下,希望能帮助到你

本文是《通俗易懂的中后台系统建设指南》系列的第九篇文章,该系列旨在告诉你如何来构建一个优秀的中后台管理系统

权限模型有哪些?

主流的权限模型主要分为以下五种:

  • ACL模型:访问控制列表
  • DAC模型:自主访问控制
  • MAC模型:强制访问控制
  • ABAC模型:基于属性的访问控制
  • RBAC模型:基于角色的权限访问控制

这里不介绍全部的权限模型,有兴趣你可以看看这篇文章:权限系统就该这么设计,yyds

如果你看过、用过市面上一些开源后台系统及权限设计,你会发现它们主要都是基于 RBAC 模型来实现的

为什么是 RBAC 权限模型?

好问题!我帮你问了下 AI

对比维度ACL (访问控制列表)RBAC (基于角色)ABAC (基于属性)
核心逻辑用户 ↔ 权限
直接点对点绑定,无中间层
用户 ↔ 角色 ↔ 权限
引入“角色”解耦,权限归于角色
属性 + 规则 = 权限
动态计算 (Who, When, Where)
优点模型极简,开发速度快,适合初期 MVP结构清晰,复用性高,符合企业组织架构,维护成本低极度灵活,支持细粒度控制
(如:只能在工作日访问)
缺点用户量大时维护工作呈指数级增长,极易出错角色爆炸:若特例过多,可能导致定义成百上千个角色开发复杂度极高,规则引擎难设计,有一定的性能消耗
适用场景个人博客、小型内部工具中大型后台系统、SaaS 平台 (行业标准)银行风控、AWS IAM、国家安全级系统

总结来说,在后台系统的场景下,RBAC 模型在灵活性(对比ACL)和复杂性(对比ABAC)上取得了一个很好的平衡

RBAC 概念理解

RBAC 权限模型,全称 Role-Based Access Control,基于角色的权限访问控制

模型有三要素:

  • 用户(User):系统主体,即操作系统的具体人员或账号
  • 角色(Role):角色是一组权限的集合,代表了用户在组织中的职能或身份
  • 权限(Permission):用户可以对系统资源进行的访问或操作能力

RBAC 的设计是将角色绑定权限,用户绑定角色,从而实现权限控制

RBAC 权限模型

并且,它们之间的逻辑关系通常是多对多的:

用户 - 角色 (User-Role): 一个用户可以拥有多个角色(例如:某人既是“项目经理”又是“技术委员会成员”)

角色 - 权限(Role-Permission): 一个角色包含多个权限(例如:“人事经理”角色拥有“查看员工”、“编辑薪资”等权限)

主导权限控制的前端、后端方案

市面上这些开源 Admin 的权限控制中,存在两种主要的权限主导方案:前端主导的权限方案和后端主导的权限方案

前端主导的权限方案

前端主导的权限方案,一个主要的特征是菜单数据由前端维护,而不是存在数据库中

后端只需要在登录后给到用户信息,这个信息中会包含用户的角色,根据这个角色信息,前端可以筛选出具有权限的菜单、按钮

这种方案的主要逻辑放在前端,而不是后端数据库,所以安全性没保障,灵活性也较差,要更新权限,就需要改动前端代码并重新打包上线,无法支持“动态配置权限”

适合一些小型、简单系统

后端主导的权限方案

后端控制方案,即登录后在返回用户信息时,还会给到此用户对应的菜单数据和按钮权限码等

菜单数据、按钮权限码等都存在数据库,这样一来,安全性、灵活性更高,要更新权限数据或用户权限控制,提供相应接口即可修改

倒也不是说前端完全不用管菜单数据,而是前端只需要维护一些静态菜单数据,比如登录页、异常页(404、403...)

在企业级后台系统中,后端主导的权限方案是比较常用的,本文只介绍后端主导的权限方案

权限方案整体流程

在开始写代码之前,要清晰知道整体实现流程,我画了一张图来直观展示:

权限方案整体流程

后台系统中的 RBAC 权限实战

权限菜单类型定义

首先,在前后端人员配合中,我们最好约定一套菜单数据的结构,比如:

import type { RouteMeta, RouteRecordRaw, RouteRecordRedirectOption } from 'vue-router';
import type { Component } from 'vue';
import type { DefineComponent } from 'vue';
import type { RouteType } from '#/type';

declare global {
  export interface CustomRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
    /**
     * 路由地址
     */
    path?: string;
    /**
     * 路由名称
     */
    name?: string;
    /**
     * 重定向路径
     */
    redirect?: RouteRecordRedirectOption;
    /**
     * 组件
     */
    component?: Component | DefineComponent | (() => Promise<unknown>);
    /**
     * 子路由信息
     */
    children?: CustomRouteRecordRaw[];
    /**
     * 路由类型
     */
    type?: RouteType;
    /**
     * 元信息
     */
    meta: {
      /**
       * 菜单标题
       */
      title: string;
      /**
       * 菜单图标
       */
      menuIcon?: string;
      /**
       * 排序
       */
      sort?: number;
      /**
       * 是否在侧边栏菜单中隐藏
       * @default false
       */
      hideMenu?: boolean;
      /**
       * 是否在面包屑中隐藏
       * @default false
       */
      hideBreadcrumb?: boolean;
      /**
       * 当只有一个子菜单时,是否隐藏父级菜单直接显示子菜单内容
       * @default false
       */
      hideParentIfSingleChild?: boolean;
    };
  }

  /**
   * 后端返回的权限路由类型定义
   */
  export type PermissionRoute = Omit<CustomRouteRecordRaw, 'component' | 'children' | 'type'> & {
    /**
     * 路由ID
     */
    id?: number;
    /**
     * 路由父ID
     */
    parentId?: number;
    /**
     * 组件路径(后端返回时为字符串,前端处理后为组件)
     */
    component: string;
    /**
     * 子路由信息
     */
    children?: PermissionRoute[];
    /**
     * 路由类型
     */
    type: RouteType;
  };
}
router.d.ts 找到类型文件

以上面的类型定义为例,我们约定 PermissionRoute 类型是后端返回的权限路由类型:

我这里使用 ApiFox 来 Mock 权限路由数据,数据是这样的:

clean-admin ApiFox 文档在线地址

路由表 Mock 数据

从登录页到路由守卫

权限方案的第一步,是登录并拿到用户信息

假设我们现在用 Element Plus 搭建起了一个登录页面,当用户点击登录时,我们需要做这几件事:

  1. 调用登录接口,将账号、密码发送给后端进行验证,验证通过则返回 JWT 信息
  2. 将返回的 JWT 信息保存到本地,后续每次请求都携带 Token 来识别用户身份并决定你能拿到的权限路由数据
  3. 触发路由守卫拦截

登录操作

account-login.vue 找到全部代码

基本 Vue Router 配置

登录完成后,我们就可以触发路由守卫了,但在写路由守卫之前,我们先来配置一下基本的 Vue Router

在整个权限系统中,我们将路由数据分为两种:

  1. 静态路由:系统固定的路由,比如登录页、异常页(404、403...)
  2. 动态路由:由后端接口返回的用户角色对应的菜单路由数据

静态路由是直接由前端定义,不会从后端接口返回、不会根据用户角色动态变化,所以这部分路由我们直接写好然后注册到 Vue Router 中即可

Vue Router 配置:

import { createRouter, createWebHashHistory } from 'vue-router';
import type { RouteRecordRaw } from 'vue-router';
import type { App } from 'vue';
import type { ImportGlobRoutes } from './typing';
import { extractRoutes } from './helpers';
import { afterEachGuard, beforeEachGuard } from './guards';

/** 静态路由 */
const staticRoutes = extractRoutes(
  import.meta.glob<ImportGlobRoutes>(['./modules/constant-routes/**/*.ts'], {
    eager: true,
  }),
);

/** 系统路由 */
const systemRoutes = extractRoutes(
  import.meta.glob<ImportGlobRoutes>(['./modules/system-routes/**/*.ts'], {
    eager: true,
  }),
);

const router = createRouter({
  history: createWebHashHistory(),
  routes: [...staticRoutes, ...systemRoutes] as RouteRecordRaw[],
  strict: true,
  scrollBehavior: () => ({ left: 0, top: 0 }),
});

beforeEachGuard(router);
afterEachGuard(router);

/** 初始化路由 */
function initRouter(app: App<Element>) {
  app.use(router);
}

export { router, initRouter, staticRoutes };
图中的静态路由和系统路由是同一类路由数据,即静态路由

这个配置文件可以在 router/index.ts 找到

这个基本的 Vue Router 配置,做了这么几件事:

  1. 导入 modules 文件夹下的静态路由进行注册
  2. 路由初始化配置 initRouter ,在 main.ts 中调用
  3. 注册全局前置守卫 beforeEach、全局后置守卫 afterEach

我们实现动态路由注册的逻辑就写在 beforeEach

值得一提的是,使用了 import.meta.glob 来动态导入指定路径下的文件模块,这是 Vite 提供的一种导入方式,参考:Vite Glob 导入

路由守卫与动态注册

路由守卫是 Vue Router 提供的一种机制,主要用来通过跳转或取消的方式守卫导航:Vue Router 路由守卫

重头戏在全局前置守卫 router.beforeEach 中实现,来看看我们做哪些事:

import { ROUTE_NAMES } from '../config';
import type { RouteRecordNameGeneric, RouteRecordRaw, Router } from 'vue-router';
import { getLocalAccessToken } from '@/utils/permission';
import { userService } from '@/services/api';
import { nprogress } from './helpers';
import { storeToRefs } from 'pinia';

/** 登录认证页面:账号登录页、短信登录页、二维码登录页、忘记密码页、注册页... */
const authPages: RouteRecordNameGeneric[] = [
  ROUTE_NAMES.AUTH,
  ROUTE_NAMES.ACCOUNT_LOGIN,
  ROUTE_NAMES.SMS_LOGIN,
  ROUTE_NAMES.QR_LOGIN,
  ROUTE_NAMES.FORGOT_PASSWORD,
  ROUTE_NAMES.REGISTER,
];

/** 页面白名单:不需要登录也能访问的页面 */
const pageWhiteList: RouteRecordNameGeneric[] = [...authPages];

export function beforeEachGuard(router: Router) {
  router.beforeEach(async (to) => {
    /** 进度条:开始 */
    nprogress.start();

    const { name: RouteName } = to;

    const userStore = useUserStore();
    const { getAccessToken, getRoutesAddStatus, registerRoutes } = storeToRefs(userStore);
    const { setRoutesAddStatus, setUserInfo, logout } = userStore;

    /** 访问令牌 */
    const accessToken = getAccessToken.value || getLocalAccessToken();

    // 1.用户未登录(无 Token)
    if (!accessToken) {
      const isWhitePage = pageWhiteList.includes(RouteName);
      // 1.1 未登录,如果访问的是白名单中的页面,直接放行
      if (isWhitePage) return true;

      nprogress.done();

      // 1.2 未登录又不在白名单,则拦截并重定向到登录页
      return { name: ROUTE_NAMES.ACCOUNT_LOGIN };
    }

    // 如果已登录用户试图访问登录页,避免重复登录,要强制重定向到首页
    if (authPages.includes(RouteName)) {
      nprogress.done();
      return { name: ROUTE_NAMES.ROOT };
    }

    // 判断是否需要动态加载路由的操作
    if (!getRoutesAddStatus.value) {
      // isRoutesAdded 默认为 false(未持久化),在已经动态注册过时会设置为true,在页面刷新时会重置为 false
      try {
        // 1.拉取用户信息
        const userInfo = await userService.getUserInfo();

        // 2.将用户信息存入 Store
        setUserInfo(userInfo);

        // 3.动态注册路由,registerRoutes 是处理后的路由表
        registerRoutes.value.forEach((route) => {
          router.addRoute(route as unknown as RouteRecordRaw);
        });

        // 4.标记路由已添加
        setRoutesAddStatus(true);

        // 5.中断当前导航,重新进入守卫
        return { ...to, replace: true };
      } catch (error) {
        // 获取用户信息失败(如 Token 过期失效、网络异常)
        logout();
        nprogress.done();
        // 重定向回登录页,让用户重新登录
        return { name: ROUTE_NAMES.ACCOUNT_LOGIN };
      }
    }

    return true;
  });
}
before-each-guard.ts 找到全部代码

上面的代码已经给出了很详细的注释,从整体角度来讲,我们做了两件事:

  1. 处理一些情况,比如用户未登录、登录后访问登录页、白名单等情况
  2. 拉取用户信息,动态注册路由

路由守卫逻辑图

在路由守卫中“拉取用户信息”,一般来说,除了返回用户本身的信息外,还会给到权限路由信息、权限码信息,这里的数据结构可以跟后端进行约定

比如在 vue-clean-admin 中,返回的数据结构是这样的:

在 ApiFox 文档可以找到用户接口说明:ApiFox 文档 - 用户信息

后端路由结构的转化

在通过“拉取用户信息”拿到路由数据后,并不是直接注册到 Vue Router,而是需要进行处理转化,才能符合 Vue Router 定义的路由表结构,registerRoutes 就是处理后的路由表,处理后的类型定义可以参考 CustomRouteRecordRaw

处理什么内容呢?

比如,接口拿到的路由数据字段 component 是一个字符串路径,这是一个映射路径,映射到前端项目下的真实组件路径

路由表结构转换

实现路由结构转换的代码,我写在了 router/helpers.ts,最主要逻辑是 generateRoutes 函数:

/**
 * 生成符合 Vue Router 定义的路由表
 * @param routes 未转化的路由数据
 * @returns 符合结构的路由表
 */
export function generateRoutes(routes: PermissionRoute[]): CustomRouteRecordRaw[] {
  if (!routes.length) return [];
  return routes.map((route) => {
    const { path, name, redirect, type, meta } = route;
    const baseRoute: Omit<CustomRouteRecordRaw, 'children'> = {
      path,
      name,
      redirect,
      type,
      component: loadComponent(route),
      meta: {
        ...meta,
        // 是否在侧边栏菜单中隐藏
        hideMenu: route.meta?.hideMenu || false,
        // 是否在面包屑中隐藏
        hideBreadcrumb: route.meta?.hideBreadcrumb || false,
        // 当只有一个子菜单时,是否隐藏父级菜单直接显示子菜单内容
        hideParentIfSingleChild: route.meta?.hideParentIfSingleChild || false,
      },
    };

    // 是目录数据,设置重定向路径
    if (type === PermissionRouteTypeEnum.DIR) {
      baseRoute.redirect = redirect || getRedirectPath(route);
    }
    // 递归处理子路由
    const processedChildren =
      route.children && route.children.length ? generateRoutes(route.children) : undefined;

    return {
      ...baseRoute,
      ...(processedChildren ? { children: processedChildren } : {}),
    };
  });
}

经过 generateRoutes 处理的路由表,再 addRoute 到 Vue Router 中

侧边栏菜单的渲染

当路由守卫的逻辑走完后,就进入到首页,在首页中,我们会根据路由表(转换过的)来渲染侧边栏菜单

侧边栏菜单是拿 Element Plus 的 el-menu 组件来做的,我们封装了一个菜单组件,除了渲染路由数据外,也更方便自定义配置菜单属性(meta)来实现一些功能

封装不难,就是拿处理后的路由表循环渲染 menu-item,根据 meta 配置项来实现"是否隐藏菜单","当只有一个子菜单时,是否隐藏父级菜单直接显示子菜单内容"等

菜单组件封装

菜单组件的封装代码在 basic-menu 文件夹中

到这一步,已经实现了动态权限路由及侧边栏菜单的渲染,但还不算完

因为我们还不能自由定义菜单信息、角色信息、用户信息来实现权限控制,在下一篇文章来聊聊管理模块

了解更多

系列专栏地址:GitHub 博客 | 掘金专栏 | 思否专栏

实战项目:vue-clean-admin

交流讨论

文章如有错误或需要改进之处,欢迎指正

无论是零代码小白还是资深开发者,都能在这些平台上找到适合自己的解决方案。今天,我们就来盘点一下 2026 年最值得关注的开源低代码 / 零代码平台,帮助您找到最适合的工具。

一、敲敲云 - 永久免费开源零代码平台

2026 年 1 月 12 日,敲敲云全新版本 v2.3.0 正式发布!  这一版本最大的亮点是正式宣布永久免费开放,彻底打破了传统零代码平台的用户数、应用数、表单数等多重限制,实现真正的零门槛、零成本使用。

敲敲云专注于为企业快速构建应用和工作流,是一款强大且易用的零代码平台。用户无需编写任何代码,即可通过丰富的组件库轻松创建各类应用,真正做到了 "人人都是开发者"。

产品特点:

  • 免费零代码使用,快速上手,无需开发背景
  • 丰富的组件库和模板,满足多样化应用需求
  • 可视化流程设计器,支持拖放式工作流设计
  • 强大的工作流引擎,支持复杂流程逻辑与条件判断
  • 优秀的团队协作功能,支持资源共享和协同开发
  • 数据收集能力强,快速高效地采集业务数据

官网:www.qiaoqiaoyun.com

源码下载

快速安装

二、JeecgBoot - 免费开源低代码平台(最流行)

JeecgBoot 是国内首个免费开源的低代码平台,基于 BPM 理念,采用前后端分离架构(SpringBoot 3.x、SpringCloud、Vue、Mybatis-plus 等),支持微服务架构。其强大的代码生成器可一键生成前后端代码,极大减少重复劳动,提升开发效率。

作为国内最流行的低代码平台之一,JeecgBoot 在 Java 开发者社区中拥有极高的知名度和活跃度。

产品优势:

  • 免费开源,社区活跃,灵活度高,适合 Java 项目
  • 提供丰富低代码模块,实现真正零代码开发(在线表单、报表、大屏设计、移动配置、流程设计等)
  • 简单功能零代码配置,复杂功能低代码生成,兼顾智能与灵活性
  • 业务流程采用工作流引擎,流程与表单松耦合设计,支持灵活配置
  • 保障企业流程保密性,显著减轻开发人员负担
  • 国产数据库友好(达梦、人大金仓)

官网:www.jeecg.com

源码下载

三、积木报表 - 像搭建积木一样设计报表

积木报表 (jimureport),是一款免费的数据可视化报表,含报表、打印、大屏和仪表盘,像搭建积木一样完全在线设计!功能涵盖:复杂报表、打印设计、图表报表、门户设计、大屏设计等!

  • JimuReport 侧重传统复杂报表和打印

  • JimuBI 侧重数据大屏和仪表盘可视化设计

产品优势:

  • JimuReport 采用 Web 版报表设计器,类 Excel 操作风格,通过拖拽完成报表设计,所见即所得。
  • 领先的企业级 Web 报表,支持各种复杂报表,专注于解决企业报表难题。
  • JimuBI 是专注于数字孪生和数据可视化的工具,旨在通过直观、动态且视觉吸引力强的形式呈现实时业务数据,尤其擅长打造 交互式大屏和仪表盘
  • JimuBI 业内唯一实现全场景覆盖:同时支持大屏(炫酷动态)、仪表盘(专业分析)、门户(交互式业务看板)、移动端(随时随地查看),真正实现 "一次开发,多端适配"。
  • 大屏采用类 word 风格,可以随意拖动组件,想怎么设计怎么设计,可以像百度和阿里一样,设计出炫酷大屏!
  • 秉承 "简单、易用、专业" 的产品理念,极大的降低报表开发难度、缩短开发周期、节省成本.

官网:https://jimureport.com

代码下载

四、Budibase

Budibase 是一个开源低代码平台,可以更快地构建业务应用程序,从而增强团队能力并提高生产力。IBM、Deloitte、Proctor 和 Gamble、Rakuten 等企业在内部使用该平台。

它利用内部数据库,但也集成了领先的数据库,包括 ArangoDB、DynamoDB、Mongo DB、MySQL、S3 等。

产品特点包括:

  • 为所有团队成员快速构建内部工具
  • 在企业中设置和自动化表单
  • 创建管理面板来管理数据和
  • 团队和客户的简单门户

源码下载

五、Appsmith

Appsmith 是一个用于构建管理面板、内部工具和仪表板的低代码项目。与超过 15 个数据库和任何 API 集成。构建你需要的一切,速度提高 10 倍。允许你拖放组件来构建仪表板、使用 Java 对象编写逻辑并连接到任何 API、数据库或 GraphQL 源。

源码下载

六、BudiBase

Budibase 是一个开源的低代码平台,帮助 IT 专业人士在几分钟内在自己的基础架构上构建、自动化和交付内部工具。它专注于为开发人员提供工具,以加快一个平台内的开发、部署和集成过程。

源码下载

七、Joget

Joget 使业务用户、非编码人员或编码人员能够使用单一平台轻松构建、交付、监控和维护企业应用程序。Joget DX 在一个简单、灵活和开放的平台中结合了业务流程自动化、工作流管理和低代码应用程序开发的优点。

项目地址

八、n8n(流程自动化)

n8n 是一个开源的工作流自动化工具,主要用于连接不同的应用程序和服务,实现数据的自动化处理和流程的自动化执行。它提供了一个可视化的界面,让用户可以通过拖拽节点的方式来构建工作流,无需编写复杂的代码。

主要特点包括:

  • 节点式工作流设计:用户可以通过拖拽不同的节点来构建工作流,每个节点代表一个特定的功能或操作。
  • 丰富的集成能力:n8n 支持与多种第三方服务和应用程序的集成,如 Slack、Google Drive、GitHub 等。
  • 自定义节点:用户可以根据自己的需求创建自定义节点,扩展 n8n 的功能。

源码下载

大家好,我是 WeAgentChat (唯信) 的开发者。

打开微信,那里是工作群的消息轰炸、亲戚的催婚和半生不熟的社交点赞。
有时候我在想,如果有一个平行的微信,里面所有的“好友”都是 AI ,但他们不仅能陪我聊天,还能像真人一样拥有性格、记得我们的点点滴滴,永远秒回、永远在线、永远站在我这边,那会是什么体验?

于是,我撸出了这个 AI 版微信WeAgentChat (唯信)

👉 Talk is cheap, show me the code: GitHub | 官网 & 预览

🌟 核心定义:你的另外一个微信

WeChat 是给人类朋友的,WeAgentChat 是给 AI 朋友的。

在这个应用里,我不仅刻意复刻了微信经典的 UI 风格和交互习惯(强迫症级别的还原),更试图打破目前 AI 助手“一问一答、用完即走”的工具属性,打造一个有温度的虚拟社交圈

1. 高度人格化的 Agent 矩阵

你可以为每个 AI 好友设定独特的灵魂。他们不是通用的助手,而是拥有特定性格、背景故事甚至怪癖的“数字人类”。

  • 有的可能是你的“毒舌损友”,在你犹豫不决时推你一把;
  • 有的可能是“温和的长辈”,在你压力大时提供情绪价值。

2. 拒绝捏人焦虑:好友库 & 话题寻人

不知道跟谁聊?懒得自己写 Prompt ?

  • 丰富的预设好友库:内置了数十位性格迥异的角色,从二次元老婆到硅谷大佬,一键添加,即刻开聊。
  • 通过话题找名人:这是我最喜欢的功能。想聊“科幻小说”?系统自动为你推荐“刘慈欣”;想聊“烧脑电影”?“诺兰”直接出现在列表里。只需输入感兴趣的话题,系统会通过语义匹配找到最契合的 AI 聊伴。不再尬聊,直奔主题。

3. “双轨”长期记忆:它真的懂你

大多数 AI 聊久了就会“失忆”,这种割裂感非常毁体验。我设计了一套双轨记忆系统:

  • Global Profile:AI 会自动根据聊天内容,实时更新它对你的性格、喜好、现状的认知。
  • Event-Level RAG:每一段深刻的对话都会被蒸馏成“事件卡片”。即使你半年前随口提过一句失眠,今天它可能又会恰到好处地关心你的睡眠质量。

4. 被动会话管理:告别“新建聊天”

我极其讨厌 ChatGPT 那种“手动点 New Chat”的割裂感。
在唯信里,如果你停止聊天超过 30 分钟,系统会自动归档当前会话并提取记忆。下次你再开口时,就像真朋友一样,是一个自然、连贯的新开始。

5. 绝对自由的对话空间 (NSFW Friendly)

我知道很多朋友苦于大厂模型的道德审查。
得益于本地化架构,你可以自由接入无审查模型(如各类 Uncensored 本地模型或 API )。在这里,没有云端审判,你可以聊任何想聊的话题,释放最真实的压力。

🛠️ 硬核技术实现 (V 站惯例)

作为一个本地优先的应用,我选择了最稳健的工具链:

  • Frontend: Vue 3.5 + Vite + Tailwind CSS (UI 高度还原微信风格)。
  • Backend: FastAPI (Python) 异步驱动。
  • Database: SQLite + sqlite-vec (所有的向量存储和关系数据都在本地,隐私第一)。
  • Memory Engine: 嵌入式 Memobase SDK ,处理复杂的事件提取和 RAG 检索。
  • Desktop: Electron 包装,支持一键启动后端服务。

🔒 隐私与安全

这可能是我做这个产品最坚持的一点:所有聊天记录和记忆数据都保存在你本地的 sqilte 数据库中。
你可以连接 OpenAI (兼容) 的 API 。除了 LLM 和向量化的调用,没有任何数据会上传到云端。

💡 开发小花絮:Vibe Coding 时代的产物

说起来,这个项目的诞生还要感谢现在的 AI 编程浪潮。
每天在公司上班,我已经习惯了 Vibe Coding 的节奏:把繁杂的逻辑丢给 AI ,看着它在屏幕上飞速吐代码。
在等待 AI 生成代码的那几十秒、几分钟的“贤者时间”里,我不仅没闲着,反而以此为契机,并行开启了这个 Side Project 。
用 AI 帮我省下的时间,去创造另一个全是 AI 的世界,这大概就是程序员独有的浪漫(摸鱼)吧。

💬 邀请与反馈

目前项目还在活跃开发中,核心的对话流和记忆系统已经跑通。

我想听听大家的看法:

  • 如果拥有这样一个“另外的微信”,你最希望在这里和什么样的 AI 交朋友?
  • 在“人与 AI 深度社交”这个命题下,你最看重的功能是什么?

目前的 UI 预览

主界面

欢迎拍砖,也欢迎给个 Star 鼓励一下社恐开发者的奇思妙想。

最近写一个关于 Proxmox VE 多集群开源项目,第一次整这玩意,各位观众老爷们给评一评,国内会有人用?不知道有木有要入坑欢迎大家一起交流交流

项目简介

一个开源的 Proxmox VE 多集群 Web 管理平台,解决多集群运维的痛点。

解决什么问题

如果你运维多个 PVE 集群,应该深有体会:

  • 在多个 Web 界面之间频繁切换
  • 手动同步虚拟机模板费时费力
  • 缺少跨集群的资源全局视图

PveSphere 提供统一的控制面板,让你从单一界面管理所有集群。

核心功能

  • 多集群统一管理
  • 虚拟机生命周期管理(创建、迁移、备份等)
  • 自动化模板同步
  • 实时资源监控
  • VNC 控制台访问

快速体验

git clone https://github.com/pvesphere/pvesphere.git
cd pvesphere
make docker-compose-build

默认账号:[email protected] / Ab123456

访问: http://localhost:8080

技术栈

  • 后端:Go + Nunu 框架
  • 前端:Vue + vue-pure-admin
  • 部署:Docker Compose

适用场景

✅ 管理多个 PVE 集群
✅ 需要自动化模板分发
✅ 需要集中监控和管理

❌ 单集群用户(原生界面可能更合适)

项目地址

联系方式

博客原文

https://www.ljohn.cn/posts/91d244ba/

欢迎试用和反馈 🙌