news 2026/10/15 5:55:32

.NET 5+Vue 2.6开源快速开发框架:架构、权限与实战部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET 5+Vue 2.6开源快速开发框架:架构、权限与实战部署

我最初接触到这套基于 .NET 5 的开源快速开发框架时,心态是半信半疑的。仓库介绍不长,信息量却很大:框架源码、内置 ERP、OA、CRM 系统,前端用的是 Vue 2.6 前后端分离架构。这类自我介绍我见过太多,很多项目点进去只有一个空壳登录页,数据库还没有,号称"快速开发"其实连跑起来都费劲。真正 clone 下来之后,我得承认之前的判断有点武断。登录、菜单、权限、组织架构全套是齐的,三个业务模块的表结构和页面也都躺在源码里,单据列表、审批流、客户管理这些典型场景可以直接当模板抄。我后来拿这套东西做基座,给一家制造业客户搭了内部管理后台,整体交付节奏比从零开始快了一半以上。

这篇文章不打算吹某个具体项目,而是把你在面对类似仓库时会遇到的实际问题讲透:源码为什么这么组织、ERP/OA/CRM 三个模块放在框架里到底有什么用、权限从前端到后端怎么打通、怎么跑通并生成新模块、以及部署和升级过程中我会踩到的坑。适合三类人看:想快速交付后台管理系统的人、正在做技术选型评估的负责人、以及想用一个完整源码项目同时入门 .NET 5 和 Vue 2.6 协作方式的初学者。

1. 框架和业务模块放在同一个仓库里,这个设计值多少分

1.1 三个现成业务模块的真正价值不是"开箱即用"

普通脚手架类项目,一般只会给你用户、角色、菜单这三件套,业务逻辑一概没有。这个仓库上来就直接把 ERP、OA、CRM 三个系统的源码摆在面前,表面看是"开箱即用",但如果你只是想给公司做一个内部工具,这三个模块反而是负担:表多、页面多、逻辑复杂,删起来费劲。

我实际用下来的结论是:这些内置业务模块真正值钱的地方,不在"直接用",而在"当参考"。如果你需要知道入库单这种"主表 + 明细 + 状态"的模型在代码里应该怎么落、审批流应该怎么抽象成配置表、客户和联系人的一对多关系在前端页面怎么联动,这些模块就是现成的标准答案。它们之间的学习价值甚至高于业务价值——ERP 解决复杂单据的数据结构问题,OA 解决多级审批的流程问题,CRM 解决最基础的一对多关联写法。我的建议很明确:拿到手先别急着删,把这几个模块里最贴近自己业务的那一块完整读一遍,再决定哪些表、哪些页面可以移除。

1.2 为什么这种组合在开源圈这么常见

"开发框架 + 行业模板 + 前后端分离"这种组合,本质上是在解决一个信任问题。单纯一个框架,你很难判断它的设计是否合理;但当你看到一个仓库里连 ERP 的库存流水、OA 的审批节点都能跑起来,至少说明作者把框架的扩展路径验证过一遍。.NET 5 作为技术底座,好处是跨平台、部署灵活、性能好,同时 C# 语言在处理复杂业务逻辑和并发场景时表达力很强;前端选 Vue 2.6,核心原因是生态成熟、上手曲线平缓,配合桌面端组件库做后台管理系统非常顺。两边组合起来,后端把业务规则管住,前端把交互体验铺开,中间用接口和权限码衔接,这是目前最稳妥的团队协作方式之一。

当然,这个组合是有时间成本的选型。.NET 5 属于非长期支持版本,官方支持周期早就结束了;Vue 2.6 也进入了维护尾声。这类源码适合作为学习和改造的基座,不适合直接当作长期生产系统的全部依赖。评估时最好把这层账也算进去,后面升级路径才能预先排好。

1.3 评估这类框架时问自己的三个问题

我帮别人看这类项目的时候,一般先问三个问题,回答清楚了再决定要不要深入:

  • 内置的业务模块对你意味着什么。你只需要一个骨架,还是需要行业模板做蓝本?如果只是做内部小系统,内置模块再多也是噪音;如果是给某个行业客户交付,模块越贴近需求越省事,但要小心通用实现和客户的特殊流程对不上。
  • 团队对这套技术栈的熟悉程度。.NET 5 和 Vue 2.6 都要求不少人力的投入,后端至少得有人能改 EF Core 迁移和权限过滤器,前端得有人能看得懂动态路由和自定义指令。团队不熟,再好的源码也救不了进度。
  • 你打算为"自定义维护"留多少预算。开源框架不是拿来即用的成品,它更像一个工程脚手架。你必须在它上面做二次开发、修 bug、升版本,这部分成本往往比框架本身的报价高得多。看清了这三点,再决定要不要把仓库放进你的技术选型候选列表。

2. 代码分层与模块组织:从 .NET 5 后端到 Vue 2.6 前端的映射

2.1 后端解决方案的服务分层

这套框架的后端解决方案,按职责拆成了几个独立项目,每个项目的目标非常明确:

项目职责主要工作
WebApi 层控制器、DTO 出入参、认证、权限过滤、异常处理
应用服务层业务流程编排、事务控制、用例逻辑
领域层实体、枚举、业务规则、领域事件
基础设施层EF Core DbContext、仓储实现、数据库迁移
公共层通用工具类、常量、扩展方法

一次典型请求的流转顺序是:前端携带 JWT 发起请求,认证中间件解析令牌,控制器完成参数绑定和 DTO 校验,应用服务层调用仓储查询数据并执行业务规则,最后返回 JSON 给前端。

这个分层里最重要的一条规则,业务逻辑不要写在 Controller 里。Controller 只做"协议适配":接收什么、返回什么。真正的规则校验、状态流转、计算逻辑都放在应用服务层,这样一旦前端换了调用方式,或者要加一个定时任务调用同一个逻辑,你不需要动接口层代码,直接复用服务就行。我在实际项目里经常见到反例:一个控制器方法里捏了十来行业务代码,跨模块调用只能复制粘贴,最后整个系统到处是隐式逻辑,改一处全局崩,谁碰谁头疼。

2.2 Vue 2.6 前端目录与后端接口的对应关系

前端工程基本按"接口、页面、状态、路由、请求封装"五块组织,和常见的中后台项目结构保持了一致:

  • api 目录按后端控制器拆分,一个业务模块一个文件
  • views 目录放页面组件,每个业务模块一个文件夹
  • store 用 Vuex 保存用户信息、登录状态、权限码集合
  • router 负责路由,菜单来自后端,路由表动态生成
  • utils/request 封装 axios,统一处理 baseURL、token 注入和错误提示

前后端分离在代码上的真实含义,不只是前端用 Vue、后端用 .NET,而是"前端只负责渲染和交互,所有数据和权限都从接口拿",前端根本不直接访问数据库。以"拉取某个模块的列表"为例:页面里调用 api 目录对应方法,axios 拦截器自动带上 token,后端校验权限后返回带分页的数据,前端把数据填充进 table 组件。这套链路读通了,后面任何模块都能按同一个思路快速上手。

2.3 库表前缀和模块边界是这套框架的隐藏设计

数据库层面,这套框架采用"一个库 + 模块前缀"的集中式设计:sys_ 开头的表管系统基础数据,erp_ 开头的表管库存和单据,oa_ 开头的表管审批流程,crm_ 开头的表管客户关系。这个设计在我实际使用中很讨喜,因为单库单前缀的好处非常实在:

  • 表结构清晰,从前缀能直接看出归属哪个模块,新同事上手也快。
  • 权限控制好做,同一套用户体系下,按模块分配菜单和按钮权限即可。
  • 跨模块查询方便,比如 OA 审批单要关联 ERP 的单据编号,单库里一条 join 就能拿到。
  • 迁移和备份成本低,一个系列用一个库,运维策略可以统一,不用为每个模块单独维护一套连接配置。

只有一种情况需要考虑拆库,就是某个模块的数据量、写入频率和其他模块差距极大,比如 OA 里的消息推送量远超库存业务,那才可以先把这类热点数据拆出来单独做处理。对绝大多数内部管理系统而言,一个库加前缀已经是最合理的起点,拆库是后置优化,不是开局就把它提上日程。

3. 权限体系是这套框架最有复用价值的部分

3.1 RBAC 落地到几张核心表

权限是后台管理系统的地基,这套框架在用户管理之外,把权限拆得非常细。基础表设计就是经典的 RBAC:sys_user 用户表、sys_role 角色表、sys_menu 菜单表,再加 sys_user_role 和 sys_role_menu 两张关联表。菜单表里除了路由信息,还有一个 permission 字段,存的是权限码,格式一般像erp:stock:add,表示"库存管理-新增"这个操作。

登录成功后,后端会把当前用户拥有的权限码列表放进 JWT 里。后端接口每次请求都通过一个权限过滤器校验,校验的核心逻辑可以抽象成这样的伪代码:

public class PermissionFilter : IAuthorizationFilter { private readonly string _requiredPermission; public PermissionFilter(string requiredPermission) { _requiredPermission = requiredPermission; } public void OnAuthorization(AuthorizationFilterContext context) { var permissions = context.HttpContext.User.Claims .Where(c => c.Type == "permissions") .Select(c => c.Value); if (!permissions.Contains(_requiredPermission)) { context.Result = new JsonResult(new { code = 403, message = "无权访问" }); } } }

控制器的方法上只要打上对应的权限码特性,这个接口就自动纳入了权限控制范围。之所以用权限码而不是简单判断"是不是管理员角色",是因为权限码的粒度足够细:一个角色可能对应几十个权限码,而一个权限码也能挂到多个角色上。这种多对多关系比到处写死"if (user.Role == "Admin")"要灵活得多,改权限时直接操作角色和菜单的关联表,不用改代码。

3.2 数据权限:同一个接口,不同人看到不同范围

权限码解决的是"能不能点"的问题,数据权限解决的是"点了之后能看到哪些数据"的问题。举个例子:仓库管理员应该看到全部库存单据,销售只能看到自己名下的合同,部门主管能看到整个部门的报销记录。这三类请求其实走的是同一个接口,差别只在后端数据过滤条件不同。

这套框架在数据权限上通常提供三级范围选择:本人、本部门、全部。实现时不是在前端把列表数据 chunk 以后再过滤,而是在后端查询阶段就注入过滤条件。具体做法是:根据当前用户的组织编码和部门信息,在原有查询表达式上动态拼接 Where 条件,比如"归属人等于当前用户"或者"归属部门在用户部门及以下"。这里有个必须坚持的原则——数据过滤必须发生在离数据库最近的地方,而不是前端二次过滤。否则前端一旦被绕过,整个数据面就全部暴露了,权限等于摆设。

3.3 前端按钮权限怎么和后端权限码联动

页面上的操作按钮,不能每个都老老实实写一遍 v-if 判断有没有权限。这套框架的前端用了一个自定义指令来做统一控制,页面里写作:

Vue.directive("permission", { inserted(el, binding) { const codes = store.getters.permissions; if (!codes.includes(binding.value)) { el.parentNode && el.parentNode.removeChild(el); } } });

页面上的新增按钮只要写<el-button v-permission="'erp:stock:add'">新增</el-button>,用户没有对应权限码时,按钮直接自动隐藏。这个设计把权限判断从每个页面里抽出来了,新页面加按钮权限几乎零成本。

但必须把丑话说在前面:前端按钮控制只是体验优化,不是安全边界。一个对权限敏感的操作,一定要后端接口再校验一次。JS 可能会被绕过,请求可以直接发给接口,所以后端权限过滤才是最后一道防线。这套框架的处理方式是双轨并行,前端控制交互可见性,后端控制数据访问合法性,两者缺一不可。

4. ERP、OA、CRM 三种业务场景的源码骨架拆解

4.1 ERP 模块:单据统计与库存流水

ERP 模块最值得拆解的是把"单据"和"库存"这两件事分开处理。典型模型是商品表、仓库表、入库单/出库单主表、单据明细表、库存表。主表记录单据头信息,包括单号、日期、经办人、状态、备注;明细表记录这张单里有几行商品、每个商品的数量和单价;库存表才是最终的数量余额。

这里最关键的设计是:库存数量不是被直接 update 的,而是通过"流水"累加出来的。每次入库、出库、盘点,都生成一条库存流水记录,当前库存数量由流水汇总计算而来。这样做的好处是任何一笔数量的来龙去脉都清晰可查,上了审计场景也不会扯皮。同时,因为不在同一个表里反复 update 同一行,高并发下的锁冲突也减少了。这套"主表 + 明细 + 流水 + 状态字段"的结构,后来我复制给采购、销售、固定资产好几个模块,基本换张表就能复用,这就是 ERP 模块作为参考实现的真正价值。

4.2 OA 模块:审批流抽象成一张配置表

OA 模块常见的业务是请假、报销、用章申请,表面上每一个都是一张独立表单,但它们的底层逻辑完全一致:提交一条业务申请,按指定顺序经过多个审批人,全部通过后业务状态变成已审批。这套框架把审批流本身抽象成了两张表:一张审批配置表定义节点顺序、每个节点对应的审批角色或人员,一张审批实例表记录当前某条业务的流转进度。业务表不直接存下一步审批人是谁,而是通过一个 businessId 关联到审批实例。

这种抽象的妙处在于,审批流和具体业务完全解耦。我给客户做合同审批的时候,不需要改 OA 模块的代码,只需要建一张合同业务表,然后在配置表里定义节点:提交人部门主管、法务、总经理,顺序排好,审批逻辑原样复用。字段设计上,审批配置表大概需要流程名称、业务类型标识、节点序号、审批者角色、是否允许会签;审批实例表则需要实例编号、业务表名、业务单号、当前节点序号、状态、各节点审批时间和意见。把这套结构吃透,OA 模块就不仅仅是一个请假系统,而是一套能套用到整个公司的审批基础设施。

4.3 CRM 模块:一对多关联的教科书写法

CRM 模块是三个系统里最温柔的一个,非常适合拿来作为第一次读源码的入口。数据模型很经典:客户表是一级,联系人表是客户下面的二级,商机表又挂在客户下,商机再挂跟进记录和下次计划。一个客户可以关联多个联系人、多个商机,商机可以有多条跟进记录,这种层层嵌套的一对多关系,前后端都有标准写法。

前端页面上,左边是客户列表,右边是选中客户之后的联系人和商机 tabs,点进商机还能看到跟进时间线。文本输入、下拉选择、时间线组件各占一块,交互不算复杂,但链路完整。把 CRM 模块端到端读一遍,你就能理解"后端返回嵌套结构还是平铺结构、前端怎么把列表和详情串起来"这一系列基础问题。我个人把这个模块当成框架的入门教材推荐给 A 同学,他花了一天时间从客户列表追到商机页面,基本就把这套框架前后端协作的套路摸清了。

5. 实操:拿到源码之后怎么跑通,再长出一个新模块

5.1 第一次启动的完整步骤

第一次把这套框架跑起来,按下面的顺序来做最不容易卡住:

  1. 装好环境:.NET 5 SDK、Node.js(建议用 14 或 16)、SQL Server 或 MySQL(看仓库默认配置),再准备一个数据库管理工具。
  2. 在后端根目录执行dotnet restore还原 NuGet 依赖。
  3. 打开后端 WebApi 项目的 appsettings.json,修改连接字符串,指向你自己的数据库实例。
  4. 执行dotnet ef database update生成数据库和全部表结构。
  5. 切到前端目录执行npm install;如果 npm 版本较高出现依赖冲突,加上--legacy-peer-deps参数。
  6. 执行npm run dev启动前端开发服务,浏览器打开配置好的前端地址。

这套流程看起来简单,实际最容易出问题的环节在第四步的数据库连接。很多人的 SQL Server 实例登录方式、数据库名、连接字符串 key 和后端代码对不上,迁移就报一堆看不懂的错。我的经验是先手动建一个空库,再执行迁移,遇到报错先看连接字符串的 key 是否和上下文配置一致,别急着怀疑框架本身。

5.2 用代码生成器从一张表生成一整套页面

跑通之后,下一步就是让框架干活。代码生成器是这类框架的核心卖点,逻辑并不神秘:读取数据库表元数据,按预先写好的模板生成后端 Entity、Service、Controller 和前端列表页、新增页、编辑页。使用流程一般是:

  1. 在数据库里建好业务表,字段注释写得尽可能清楚,主键命名规范。
  2. 打开框架内置的代码生成工具,选择目标表和要生成的模块位置。
  3. 配置生成参数:哪些字段出现在列表、哪些字段参与查询、哪些字段走下拉字典、哪些是必填。
  4. 点击生成,代码自动落盘到后端和前端对应目录。
  5. 重启后端服务,在菜单管理里注册新菜单,分配权限码给角色。
  6. 刷新前端页面,点击新菜单,一个可增删改查的列表页面就出来了。

为什么强调表注释和字段规范?因为生成器生成的质量直接取决于元数据质量。字段类型、长度、注释、空值约束都被映射到页面控件上,表设计得越规范,生成出来的代码需要手动改的地方就越少。这不是玄学,是模板化生产的常识。

5.3 生成之后的四类手动微调

生成只是起点不是终点,我的经验是拿到生成代码后,还要做四类常规微调:

  • 列表查询条件的形式。默认生成的可能是文本框相等查询,但真实业务往往需要日期范围、模糊匹配、多选下拉,这些要自己去查询层调整。
  • 下拉数据源。有些字段应该从字典表取值,有些应该从关联业务表动态加载,生成器往往给的是静态字典,需要手动改成远程搜索。
  • 详情页的关联数据。如果没有一键生成的详情方案,通常要在详情页面里补上关联的子表单,比如合同台账里带一个收款计划列表。
  • 按钮权限码的粒度。默认生成给的是模块级权限码,如果要对"审核""作废"这种特殊按钮做隔离,就得手动拆出更细的权限码并设置角色关联。

举个例子:我做过一个合同台账模块,表建好之后生成只花了十分钟,但客户要求按合同金额筛选、按客户名称远程搜索、附件上传、审批状态回显,这些加起来花了差不多一个下午。生成器帮你省的是"表单和列表的骨架",业务上的特殊规则始终得人来补,提前有这个预期,后面就不会对生成结果失望。

6. 部署、升级路上实测的坑,以及我的处理方式

6.1 Vue 2.6 工程依赖的版本陷阱

前端这套依赖锁得相当死,我大约一半的部署问题都出在版本上,最常见的两个:

一是 node-sass 和 Node 版本不兼容。老版本 node-sass 在较新的 Node 环境下编译会直接失败,表现是安装时一堆编译报错、装完运行又崩。解决办法有两个:要么把 Node 锁到 14 或 16 的 LTS 版本,要么把 node-sass 替换成 sass 包并在 webpack 配置里改用对应的 loader。我倾向于后者,因为这样不用为了一个老项目维护一个老 Node 环境。

二是 npm 7 以上的 peerDependencies 冲突。老项目的依赖树里有一个包声明的 peer 依赖和实际安装版本对不上,npm 7 默认就会报 ERESOLVE 错误。解决办法是安装时加--legacy-peer-deps,让 npm 退回到宽松解析模式。这个参数不是银弹,但对这类老前端工程很管用。另外,不要轻易去升级 webpack 或 Vue CLI 的大版本,Vue 2.6 的整个插件体系和大版本依赖深度绑定,升到一半最容易陷入连环兼容性冲突,最后只能把 node_modules 删了重装,浪费时间。

6.2 EF Core 迁移在多人协作时的处理

一个解决方案里既有系统模块又有 ERP、OA、CRM,如果团队有几名开发同时改表结构,迁移文件就特别容易冲突。我的处理方式有几个原则:

  • 每个功能分支独立建迁移文件,命名时写清楚业务点,不要一个提交里塞十几个迁移。
  • 合并分支时按提交时间顺序整理迁移,碰到冲突先dotnet ef migrations remove把冲突项回退,再重新生成。
  • 数据库结构变更优先走迁移脚本,不要直接手工改线上库表;手工改完和迁移文件不一致,后面一定会出现"代码管不到表"的尴尬局面。

我自己的习惯是每新增一个业务模块,先只提交表结构迁移,再提交业务代码,这样排查问题时能明确区分"数据库问题"和"代码问题",效率高很多。

6.3 .NET 5 官方支持结束后的升级思路

必须坦诚地说,.NET 5 不是长期支持版本,官方支持周期在几个月内就走完了。学习这套框架没有任何问题,源码里的设计思想依然成立;但如果要拿它上生产环境,一定要把升级路线提前排好,我的建议是往 .NET 6 或 .NET 8 迁。

升级成本主要集中在这几块:

改动点典型内容
目标框架把 csproj 里的 TargetFramework 改成 net6.0 或 net8.0
包版本把 ASP.NET Core、EF Core 相关 NuGet 包全部升到对应大版本
API 差异个别方法签名变化、nullable 配置行为调整、host 启动代码微调
第三方库兼容确认项目引用的组件库是否发布了对应版本

实际操作时,我建议先开一个分支,把最外层的 WebApi 项目目标框架先改到新版本,跑一遍全量测试,确认没有破坏性变化,再逐层升级。整个过程对这套框架本身并不伤筋动骨,因为它的分层设计让你升级时改动面能够控制在配置和依赖层面,核心业务代码大体不需要动。这不代表可以拖,越晚升级,中间隔的大版本越多,迁移的隐形成本就越高。

项目落地之后回头再看这套框架,我最真实的体会是:别把"开源"等同于"免费且完美"。快速开发框架替你解决了基础架构和重复 CRUD 的体力活,但并没有豁免你对权限模型的深度理解、对生成代码的二次打磨、对依赖版本的责任心。如果你准备拿它做项目,我的建议是开工前先花半天把 OA 审批流走一遍,再花一天把 CRM 模块的前后端代码对照着读顺,然后才开始动手删改。跳过这一步,后面每一次定位问题都要回到源码里从头猜作者意图,效率反而是最低的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 5:55:29

PHP与C语言核心差异及技术选型实战解析

从大学那会儿用C写控制台程序&#xff0c;到后来转去做Web开发&#xff0c;我第一次打开PHP文件时心里是有点不屑的&#xff1a;变量前面不用写类型&#xff0c;程序不用编译就能跑&#xff0c;这也能叫“语言”&#xff1f;结果真在项目里用上之后&#xff0c;我才发现自己理解…

作者头像 李华
网站建设 2026/10/15 5:55:26

Ollama本地部署大模型:硬件配置、量化选型与性能优化实战

1. Ollama定位与核心价值Ollama这个词&#xff0c;最近在AI圈子里出现的频率越来越高。我最初接触时也有点困惑&#xff0c;市面上那么多部署大模型的方案&#xff0c;为什么这个工具能在开发者群体里传得这么快&#xff1f;实际上&#xff0c;把它看成“本地版大模型管家”就很…

作者头像 李华
网站建设 2026/10/15 5:55:19

智能体平台会话管理设计:状态分类、持久化与并发控制

1. 会话管理为什么是智能体平台的"地下工程"如果你去问用户"会话管理是什么"&#xff0c;他大概率会一脸茫然。但如果他某天晚上发现&#xff0c;自己跟智能助手聊了两个小时的内容第二天全被遗忘&#xff0c;或者换个设备继续对话时&#xff0c;助手完全不…

作者头像 李华
网站建设 2026/10/15 5:54:49

AI大模型应用开发就业方向大盘点:6个行业适配度高,转行必看

学完AI大模型应用开发&#xff0c;只能去互联网大厂&#xff1f; 这是很多转行朋友的固有印象。其实&#xff0c;AI大模型应用开发的就业方向远比想象中宽。 据脉脉高聘人才智库《Agent重置职场——AI人才流动报告》&#xff0c;2026年1—7月&#xff0c;AI应用开发岗位占新发A…

作者头像 李华
网站建设 2026/10/15 5:54:43

RA-AF高斯混合聚类裂纹识别:用GMM替代人工分界线的Matlab实现

简介&#xff1a;基于RA-AF的高斯混合聚类裂纹模式识别Matlab代码包&#xff0c;面向材料力学、无损检测及声发射信号处理方向的研究人员与学生&#xff0c;解决传统裂纹分类依赖人工划分分界线、难以处理重叠分布数据的问题。代码采用EM迭代算法对GMM高斯混合模型进行参数估计…

作者头像 李华
网站建设 2026/10/15 5:54:30

ChatGPT赋能投顾工作流:从提示词到合规落地的实操指南

1. 投顾行业的效率困局与AI切入逻辑财富管理这条赛道&#xff0c;表面看是拼专业、拼资源&#xff0c;实际上真正拉开差距的是信息处理效率和客户触达频次。一个成熟的投顾&#xff0c;每天要面对的事情极其琐碎&#xff1a;晨会纪要要整理、宏观数据要跟踪、产品净值要更新、客…

作者头像 李华