「e家宜业」是一套基于AGPL v3开源协议开源的智慧物业解决方案。实现了微信公众号、小程序、PC、H5、智能硬件多端打通。 后端采用Koa + Typescript轻量级构建,支持分布式部署;前端使用vue + view-design开发。
禁止将本项目的代码和资源进行任何形式的出售和盈利,产生的一切后果由侵权者自负!!
微信添加好友请备注来意,谢谢。
核心目标: 彻底移除旧存储实现,统一到新的 storage 服务
- 后端清理:删除
service/upload/、service/oss.ts、types/upload.ts、module/pc/controller/upload/等旧实现 - 前端清理:删除
utils/oss.js,移除utils/index.js中的 oss 导出 - 配置统一:移除
config.ts中的upload和aliyun配置,统一使用storage配置 - 兼容清理:删除
upload.js中的兼容性方法getUploadSign、getOSSConfig等
配置统一: 所有存储相关配置集中在 storage 节点下
# 旧配置(已删除)
upload: { mode: "local", local: {...} }
aliyun: { accessKeyId: "...", oss: {...} }
# 新配置(统一格式)
storage:
mode: "local" # local/oss/minio
local: { savePath: "./uploads", urlPrefix: "/static", baseUrl: "..." }
oss: { accessKeyId: "...", bucket: "...", region: "..." }
minio: { endpoint: "...", accessKey: "...", bucket: "..." }- SMS服务:改用
config.storage.oss配置替代config.aliyun - 静态中间件:移除对
config.upload的兼容支持 - 路由清理:删除 PC 模块的
/upload/*路由
- MP模块:按需求保留小程序端的上传相关文件
- 现有接口:新的
/storage/*接口保持不变 - 前端组件:所有上传组件继续正常工作
问题: MP模块上传控制器引用已删除的旧上传服务导致编译错误
- 修复文件:
mp/controller/upload/local.ts和mp/controller/upload/sign.ts - 解决方案:将旧的
uploadService替换为新的StorageServiceFactory - 技术升级:使用统一的存储服务接口,保持功能一致性
- 验证结果:后端编译测试通过,接口功能正常
- 代码减少:删除约 2000+ 行冗余代码
- 配置简化:配置文件结构更清晰统一
- 维护性提升:单一存储服务架构,易于维护和扩展
- 编译验证:前后端构建测试全部通过
- 问题修复:MP模块编译错误完全解决
核心改进: 实现前端零配置的统一上传体验
- 新增接口:
/storage/config统一存储配置,/storage/upload统一上传处理 - 前端改进:整合
oss.js和upload.js为统一upload.js,支持三种上传策略(server/direct/presigned) - 组件升级:ImageUpload、AvatarCrop、FileUpload、MultipleImageUpload 全部使用新服务
- 配置简化:删除前端存储配置功能,统一由后端管理
核心改进: 配置统一化、模板管理通用化
- 新增服务:
template.ts统一模板管理服务 - 新增接口:
/template/config配置获取,/template/download/:type通用下载 - 前端工具:新增
template.js工具类,智能下载策略(直链优先) - 配置优化:存储配置结构统一,模板路径可配置
- 404错误:修复 Upload 组件 action 属性导致的请求错误
- 静态文件:修复本地存储模式下静态文件访问问题
- MinIO模板:优化 MinIO 模式下模板下载处理
- 代码质量:修复所有 lint 错误,提升代码规范
- 零配置:前端自动获取存储配置,无需手动设置
- 向后兼容:保持原有接口不变,平滑升级
- 智能选择:自动选择最优上传/下载策略
- 易扩展:新增存储方式或模板类型仅需后端配置
// 统一上传
import uploadService from '@/utils/upload';
await uploadService.upload(file, { dir: 'images' });
// 模板下载
import templateService from '@/utils/template';
await templateService.downloadTemplate('building_import');
// 组件使用
<ImageUpload v-model="imageUrl" dir="avatar" /># .ejyyrc 配置文件
storage:
mode: "local" # local/oss/minio
template:
path: "template"
files:
building_import: "固定资产导入模板.xlsx"
local:
savePath: "./uploads"
urlPrefix: "/static"
baseUrl: "http://127.0.0.1:6688"升级效果: 开发效率提升、维护成本降低、用户体验改善、配置管理简化
核心目标: 统一项目版权声明格式,提升代码规范性
- 问题识别:发现错误格式
/**//** * | 开源物业管理系统,敬请使用 */ */ - 格式统一:标准化为正确格式,包含完整的分隔线设计
- 覆盖范围:处理 825 个源文件,修复 800 个文件的版权声明
- 自动化工具:开发
fix_copyright.py脚本,支持批量修复
质量提升: 修复前后端项目中的语法错误
- 前端修复:
copyright.vueHTML 语法错误(多余的闭合标签)dashboard/index.vueJavaScript 计算表达式错误
- 后端修复:
service/map.tsTypeScript 数学运算符语法错误
- 验证工具:ESLint、Prettier、TypeScript 编译器全面检查
- 版权声明覆盖率:97.0% (800/825 个文件)
- 错误格式清零:0 个错误的版权声明格式
- 语法错误清零:前后端项目编译测试全部通过
- 代码格式化:所有文件通过 Prettier 格式化
- 修复脚本:
fix_copyright.py- 智能识别和修复版权声明 - 质量检查:ESLint (Vue)、TypeScript Compiler、Prettier
- 项目结构:前端 Vue.js + View Design,后端 Node.js + TypeScript + Koa
- 总源文件:825 个 (.js, .ts, .vue)
- 修复文件:800 个包含正确版权声明
- 语法修复:3 个文件的语法错误
- 代码质量:100% 通过 lint 检查
升级效果: 代码规范统一、版权声明标准化、项目质量提升、维护成本降低
核心目标: 替换第三方日志依赖,实现自主可控的日志管理
- 新增模块:
kjhlog- 自研日志工具,替代chowa-log依赖 - 功能完整:支持多级别日志(DEBUG/INFO/WARN/ERROR)、文件输出、控制台输出
- 兼容性强:保持与原
cwlogAPI 完全兼容,无缝替换 - 智能配置:开发环境控制台输出,生产环境文件记录
自动化处理: 开发自动化脚本,批量处理代码迁移
- 影响范围:21 个文件的日志调用全部迁移
- 导入管理:自动添加
kjhlog导入语句,统一使用~/utils/kjhlog路径 - API兼容:支持
log()、info()、warn()、error()、success()、warning()方法 - 全局可用:在
app.ts中初始化全局kjhlog实例
质量保证: 修复编译过程中发现的各类问题
- 参数错误:修复
oa/controller/service/reply.ts中msg.text()参数缺失 - 方法重复:重构
kjhlog内部方法,避免方法名冲突 - 类型安全:确保所有 TypeScript 类型检查通过
- 编译验证:webpack 构建测试完全通过
- 按日期分文件:生产环境按日期自动创建日志文件
- 格式统一:
[时间戳] [级别] 消息内容标准格式 - 环境适配:开发环境详细输出,生产环境精简记录
- 错误处理:日志写入失败时自动降级到控制台
- 替换文件:21 个 TypeScript 文件
- 日志调用:30+ 处日志调用点全部迁移
- 编译状态:✅ 零错误通过 webpack 构建
- 依赖清理:移除对第三方日志库的依赖
升级效果: 日志系统自主可控、减少外部依赖、提升系统稳定性、便于后续维护扩展
问题解决: 修复前端编译警告,完善配置管理
- 警告修复:解决
SITE_TITLE配置项缺失导致的编译警告 - 标题设置:统一网站标题为"智慧物业管理平台"
- 应用范围:页面标题、导航栏、打印页面、IoT仪表板等多处使用
- 构建验证:前端构建测试通过,无警告信息
- 配置文件:
console-web/src/config.js新增SITE_TITLE配置 - 使用位置:5+ 个组件和页面引用该配置
- 构建状态:✅ 前端构建无警告通过
- 用户体验:统一的品牌标识和页面标题
升级效果: 配置完整性提升、编译警告清零、品牌标识统一、用户体验改善
#how to run #后台服务 docker run -d --name api-server -p 6688:6688 -v /Users/pzq/tech/projects/ejyy/api-server/dist:/www/apiserver -w /www/apiserver node:24.2.0 sh -c "npm install && node ejyy_server.js"
#mysql docker run -d --name my-redis -p 6379:6379 redis:6.2.6 docker exec -it mysql57 mysql -u root -p
TRUNCATE TABLE ejyy_ask_for_leave;
TRUNCATE TABLE ejyy_ask_for_leave_flow;
TRUNCATE TABLE ejyy_building_info;
TRUNCATE TABLE ejyy_community_info;
TRUNCATE TABLE ejyy_community_remote_open_door_log;
TRUNCATE TABLE ejyy_community_setting;
TRUNCATE TABLE ejyy_complain;
TRUNCATE TABLE ejyy_contract;
TRUNCATE TABLE ejyy_contract_category;
TRUNCATE TABLE ejyy_contract_item;
TRUNCATE TABLE ejyy_convenient;
TRUNCATE TABLE ejyy_employee_sign_record;
TRUNCATE TABLE ejyy_employee_sign_setting;
TRUNCATE TABLE ejyy_epidemic;
TRUNCATE TABLE ejyy_feedback;
TRUNCATE TABLE ejyy_fitment;
TRUNCATE TABLE ejyy_inform;
TRUNCATE TABLE ejyy_iot_elevator;
TRUNCATE TABLE ejyy_iot_elevator_log;
TRUNCATE TABLE ejyy_iot_entrance;
TRUNCATE TABLE ejyy_iot_entrance_log;
TRUNCATE TABLE ejyy_iot_lamp;
TRUNCATE TABLE ejyy_iot_lamp_line;
TRUNCATE TABLE ejyy_iot_lamp_log;
TRUNCATE TABLE ejyy_iot_lamp_work_mode;
TRUNCATE TABLE ejyy_iot_meter;
TRUNCATE TABLE ejyy_iot_meter_read;
TRUNCATE TABLE ejyy_iot_meter_repeater;
TRUNCATE TABLE ejyy_iot_park;
TRUNCATE TABLE ejyy_iot_park_blacklist;
TRUNCATE TABLE ejyy_iot_park_log;
TRUNCATE TABLE ejyy_iot_warning;
TRUNCATE TABLE ejyy_iot_warning_log;
TRUNCATE TABLE ejyy_material;
TRUNCATE TABLE ejyy_material_category;
TRUNCATE TABLE ejyy_material_purchase;
TRUNCATE TABLE ejyy_material_purchase_flow;
TRUNCATE TABLE ejyy_material_purchase_item;
TRUNCATE TABLE ejyy_material_supplier;
TRUNCATE TABLE ejyy_material_used;
TRUNCATE TABLE ejyy_meeting;
TRUNCATE TABLE ejyy_meeting_participant;
TRUNCATE TABLE ejyy_meeting_room;
TRUNCATE TABLE ejyy_mission;
TRUNCATE TABLE ejyy_mission_category;
TRUNCATE TABLE ejyy_mission_complete;
TRUNCATE TABLE ejyy_mission_complete_node;
TRUNCATE TABLE ejyy_mission_line;
TRUNCATE TABLE ejyy_mission_line_node;
TRUNCATE TABLE ejyy_mission_point;
TRUNCATE TABLE ejyy_move_car;
TRUNCATE TABLE ejyy_notice_to_user;
TRUNCATE TABLE ejyy_notice_to_user_readed;
TRUNCATE TABLE ejyy_notice_tpl;
TRUNCATE TABLE ejyy_owner_apply;
TRUNCATE TABLE ejyy_owner_detail_log;
TRUNCATE TABLE ejyy_party;
TRUNCATE TABLE ejyy_pet;
TRUNCATE TABLE ejyy_pet_vaccinate;
TRUNCATE TABLE ejyy_property_company_access;
TRUNCATE TABLE ejyy_property_company_auth;
TRUNCATE TABLE ejyy_property_company_building_registered;
TRUNCATE TABLE ejyy_property_company_department;
TRUNCATE TABLE ejyy_property_company_job;
TRUNCATE TABLE ejyy_property_company_user;
TRUNCATE TABLE ejyy_property_company_user_access_community;
TRUNCATE TABLE ejyy_property_company_user_default_community;
TRUNCATE TABLE ejyy_property_company_user_join_record;
TRUNCATE TABLE ejyy_property_company_user_login;
TRUNCATE TABLE ejyy_property_fee;
TRUNCATE TABLE ejyy_property_fee_order;
TRUNCATE TABLE ejyy_property_fee_order_item;
TRUNCATE TABLE ejyy_question;
TRUNCATE TABLE ejyy_question_option;
TRUNCATE TABLE ejyy_questionnaire;
TRUNCATE TABLE ejyy_questionnaire_answer;
TRUNCATE TABLE ejyy_questionnaire_answer_result;
TRUNCATE TABLE ejyy_questionnaire_statistics;
TRUNCATE TABLE ejyy_refound;
TRUNCATE TABLE ejyy_refound_flow;
TRUNCATE TABLE ejyy_refound_item;
TRUNCATE TABLE ejyy_repair;
TRUNCATE TABLE ejyy_repair_urge;
TRUNCATE TABLE ejyy_schedule;
TRUNCATE TABLE ejyy_session_store;
TRUNCATE TABLE ejyy_storehouse;
TRUNCATE TABLE ejyy_topic;
TRUNCATE TABLE ejyy_user_building;
TRUNCATE TABLE ejyy_user_building_operate_log;
TRUNCATE TABLE ejyy_user_car;
TRUNCATE TABLE ejyy_user_car_operate_log;
TRUNCATE TABLE ejyy_user_car_sync;
TRUNCATE TABLE ejyy_user_default_community;
TRUNCATE TABLE ejyy_virus;
TRUNCATE TABLE ejyy_vistor;
TRUNCATE TABLE ejyy_wechat_mp_auth;
TRUNCATE TABLE ejyy_wechat_mp_user;
TRUNCATE TABLE ejyy_wechat_mp_user_login;
TRUNCATE TABLE ejyy_wechat_official_accounts_user;
TRUNCATE TABLE ejyy_workflow;
TRUNCATE TABLE ejyy_workflow_node;
#redis
#minio
#前端服务
#获取docker IP docker inspect my-redis | grep IPAddress
#获取所有容器的IP docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
#配置 1、api-server api-server/src/config.ts IP需要修改api-server对应的IP
2、console-web console-web/src/config.js IP需要修改console-web对应的IP
3、后台配饰api-server/dist/.ejyyrc 1)minio的IP 2)mysql的IP 3)redis的IP 4)


















