Compare commits

..

624 Commits

Author SHA1 Message Date
YunaiV
30ce9f6eca 1.7.2 版本的发布 2023-04-19 20:53:10 +08:00
YunaiV
1e32aaa77e 优化请求头的 tenant-id 的解析逻辑,避免前端传错类型 2023-04-15 09:47:07 +08:00
YunaiV
9832947dfa !457 【轻量级 PR】:解决敏感词导出和字典数据编辑保存的两个BUG 2023-04-15 09:41:07 +08:00
YunaiV
ec5007c3b9 !454 vben 版本代码生成器 2023-04-14 23:01:38 +08:00
YunaiV
f1330bf4e8 升级 Knife4j 4.1.0 版本 2023-04-14 09:23:03 +08:00
YunaiV
ca9656a40f 代码生成,支持配置前端 UI 类型 2023-04-13 08:50:22 +08:00
YunaiV
c5b6a2a53d 移除多余的 Spring Boot Admin 配置 2023-04-09 17:26:15 +08:00
YunaiV
f5dcdfeea4 Cloud 增加 Spring Boot Admin 的转发规则 2023-04-09 17:20:55 +08:00
YunaiV
b56c3b0e00 Merge remote-tracking branch 'origin/master' 2023-04-09 16:49:25 +08:00
YunaiV
7f20cdecac 增加 JobController,引导使用 XXL-Job 2023-04-09 16:49:18 +08:00
芋道源码
4d11b76b39 !32 修复代码生成模板中未更新至swagger3的bug
Merge pull request !32 from sukun/master
2023-04-09 04:59:53 +00:00
YunaiV
32ea8f5278 增加 Cloud 项目的一键改名 2023-04-09 11:20:14 +08:00
YunaiV
83d2e79f96 修复租户名的重复问题 + 配合周建进行测试所提bug的后端修改 2023-04-09 11:03:33 +08:00
YunaiV
79228bd947 修复工作流创建流程时,流程名可能不存在的问题 2023-04-09 10:22:38 +08:00
YunaiV
f106afc0f9 !451 xss请求Wrapper getAttribute方法 问题修复 2023-04-09 10:09:07 +08:00
YunaiV
95aeee54e7 修复配置不可见时,返回 null 的问题 2023-04-08 00:13:53 +08:00
14772
251c217a40 修复代码生成模板中未更新至swagger3的bug 2023-04-04 16:53:35 +08:00
YunaiV
1dbcf4ad7b !422 feat: 修改错误注释 2023-04-03 08:25:11 +08:00
YunaiV
9f6d8d2139 去除 CodegenTableDO 的自增标识 2023-04-02 19:22:41 +08:00
芋道源码
61394e577f !20 代码生成模块
Merge pull request !20 from yk_9546/master
2023-04-02 11:22:06 +00:00
YunaiV
9c78758cd6 完善 SecurityProperties 注释 2023-04-02 19:13:00 +08:00
芋道源码
c0fa6311ce !24 PasswordEncoder 加密复杂度自定义
Merge pull request !24 from Fanjc/N/A
2023-04-02 11:08:19 +00:00
YunaiV
984e9e7d27 优化 bootstrap-local.yaml 的注释说明 2023-04-02 19:05:39 +08:00
芋道源码
4e0bb86b68 !28 fix system-server package,可直接运行
Merge pull request !28 from lovezhike/master
2023-04-02 05:26:12 +00:00
芋道源码
d965d5e30f !31 IP查询导致异常问题
Merge pull request !31 from chasel_jc/master
2023-04-02 04:51:35 +00:00
YunaiV
13a3e8ec7a !426 【轻量级 PR】:bugfix: 转换HistoricTaskInstance.createTime -> BpmTaskRespVO.createTime 2023-04-02 12:12:29 +08:00
YunaiV
dbf9591b3b !438 fix: 短信验证码登录问题 2023-04-02 12:09:51 +08:00
YunaiV
d06d27eef3 !447 【轻量级 PR】:大陆手机号码是否正确的正则优化 2023-04-02 12:06:23 +08:00
Chasel
cdc52f32ea https://gitee.com/zhijiantianya/yudao-cloud/issues/I6KP0U
在IpUtils里修复ip空字符串引起的异常问题
2023-03-30 14:42:18 +08:00
lovezhike
d3461f58bc 修改system-server连接NACOS的配置,创建namespace需要是指定命名空间ID为dev 2023-03-21 17:48:17 +08:00
lovezhike
b2e9637587 修改system-server连接NACOS的配置,namespace需要是具体命名空间ID,不能是名称 2023-03-21 17:37:49 +08:00
Chasel
e618f8e404 https://gitee.com/zhijiantianya/yudao-cloud/issues/I6KP0U
修复ip空字符串引起的异常问题
2023-03-21 14:25:03 +08:00
lovezhike
803e3eda71 修复infra、bpm、report 的server直接运行 2023-03-15 08:38:06 +08:00
lovezhike
527b217557 修复 system server 直接运行 2023-03-14 22:36:46 +08:00
YunaiV
6d5f833c29 修复生成代码测试里面的时间问题(buildBetweenTime方法) #228 2023-03-11 10:19:11 +08:00
YunaiV
f5846b0a6c Merge remote-tracking branch 'origin/master' 2023-03-11 10:15:47 +08:00
YunaiV
4b0e64f817 修复某些情况下ContextHolder的NPE异常 #225 2023-03-11 10:15:39 +08:00
芋道源码
ffd4e0672a !26 feat:基于Spring Cloud Bus实现的Producer抽象类获取自己服务实例时获取不到
Merge pull request !26 from Lee.J.Eric/master
2023-03-11 02:07:41 +00:00
芋道源码
237455f853 !27 test: 字典数据模块单元测试
Merge pull request !27 from 与或非/gaibu/20230309
2023-03-11 02:04:32 +00:00
gaibu
853fb4b210 test: 字典数据模块单元测试 2023-03-09 22:03:21 +08:00
1906439128@qq.com
6d28124299 feat:基于Spring Cloud Bus实现的Producer抽象类获取自己服务实例时获取不到 2023-03-07 19:02:36 +08:00
YunaiV
5f96b50bad 默认配置下,本地 local 环境的定时任务是关闭的,避免控制台一直报错报错。 2023-03-05 22:38:04 +08:00
YunaiV
4d14bdffad 默认配置下,本地 local 环境的定时任务是关闭的,避免控制台一直报错报错。 2023-03-05 22:37:26 +08:00
YunaiV
00064607b8 降低 local 环境的 RocketMQ 重连频率,因为可能本地没有启动。 2023-03-05 22:20:13 +08:00
YunaiV
d21dcba1ee 1. 修复租户创建报错
2. 修复数据权限不生效
3. 修复操作日志记录报错
2023-03-05 21:59:45 +08:00
芋道源码
25c5291338 !21 Fix: #I6GVAP 更新 PostgreSQL SQL 文件
Merge pull request !21 from Geek981108/master
2023-03-05 12:32:43 +00:00
YunaiV
e1bef1ce8a 升级 reflections 版本,解决单元测试报错的问题 2023-03-05 20:28:12 +08:00
YunaiV
f1a1bb7838 优化 README 说明,明确前端仓库地址 2023-03-05 15:59:56 +08:00
YunaiV
00c95e33b3 #416 用户详情不显示所属部门部门 2023-03-05 14:59:02 +08:00
芋道源码
f180b8d7d3 !25 支持 spring doc 接口文档
Merge pull request !25 from 芋道源码/feat/springdoc
2023-03-04 13:51:46 +00:00
YunaiV
5016b76b04 合并最新 master 代码 2023-03-04 21:51:09 +08:00
YunaiV
27592b4f4a Merge branch 'master' of https://gitee.com/zhijiantianya/yudao-cloud into feat/springdoc
# Conflicts:
#	yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskTodoPageReqVO.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthMenuRespVO.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java
2023-03-04 21:48:23 +08:00
YunaiV
8048ba92c2 修复 swagger 一直报 favicon.ico 找不到的问题 2023-03-04 21:33:37 +08:00
YunaiV
6f7df7e53e 网关接入新的 Knife4j 版本 2023-03-04 17:57:58 +08:00
YunaiV
ec280224a8 基于老版本,实现 Spring Cloud Gateway 文档 2023-03-04 15:40:50 +08:00
YunaiV
59c6963f7c 优化 Swagger 的版本依赖,避免冲突 2023-03-04 15:05:58 +08:00
Fanjc
c2d70ce831 PasswordEncoder 加密复杂度自定义,可在nacos中配置
Signed-off-by: Fanjc <271366833@qq.com>
2023-02-23 05:24:54 +00:00
GeekXu
2d63b50989 fix: 🐛 #I6GVAP | 更新 PostgreSQL SQL 文件 2023-02-22 13:00:47 +08:00
GeekXu
0190984262 fix: 🐛 #I6GVAP | PostgreSQL SQL file update 2023-02-22 11:47:38 +08:00
YunaiV
220d727605 修复代码生成器的同步报错问题 2023-02-19 16:34:51 +08:00
yangkai
f34f61cc25 修复代码生成处infra_codegen_table插入未返回id导致报错问题 2023-02-14 14:15:19 +08:00
YunaiV
06b5589d1f 更新 Spring-Boot-Labs 访问地址 2023-02-11 09:24:51 +08:00
YunaiV
384d96d79d Vue3 独立到 https://gitee.com/yudaocode/yudao-ui-admin-vue3 2023-02-11 01:37:18 +08:00
YunaiV
a3ec21cb0f 适配 Vue3 工作流的预览版 2023-02-10 23:43:20 +08:00
YunaiV
7b74c28148 spring-boot from 2.7.7 to 2.7.8 2023-02-10 23:38:25 +08:00
YunaiV
a58dc7b543 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	sql/mysql/optional/vue3-menu.sql
#	sql/mysql/ruoyi-vue-pro.sql
#	yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceTest.java
2023-02-10 23:01:08 +08:00
YunaiV
90224975fc 菜单新增 alwaysShow 总是展示、componentName 组件名 2023-02-10 23:00:12 +08:00
gaibu
e28d73a76c feat: 临时提交 2023-02-10 15:42:01 +08:00
gaibu
cca9807a4e feat: 代码合并 2023-02-10 10:47:43 +08:00
gaibu
708d7db320 Merge branch 'master' of https://gitee.com/zhijiantianya/yudao-cloud into feat/springdoc
# Conflicts:
#	yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApi.java
2023-02-10 10:46:45 +08:00
YunaiV
b0409fc779 新增报表设计器、大屏设计器 2023-02-08 23:20:11 +08:00
YunaiV
a81f5de321 优化 tenant 组件,支持不引入 mq 和 job 依赖 2023-02-08 23:07:44 +08:00
YunaiV
e24d9dec01 修复 SocialUserApi 未提供 RPC 支持,导致带 token 访问时提示需登录 2023-02-08 21:59:00 +08:00
YunaiV
e76a5bdb68 准备适配 yudao-module-report 大屏报表 2023-02-07 23:13:32 +08:00
gaibu
65ee76a79f Merge branch 'master' of https://gitee.com/zhijiantianya/yudao-cloud into feat/springdoc
# Conflicts:
#	yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/errorcode/ErrorCodeApi.java
#	yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/tenant/TenantApi.java
#	yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
2023-02-05 21:28:49 +08:00
gaibu
8986299fea feat: 修改剩余部分 swagger 注解 2023-02-04 23:59:25 +08:00
YunaiV
7ef6209c13 infra:完善 DatabaseTableServiceImpl 单元测试 2023-02-04 09:57:40 +08:00
YunaiV
d5bd499899 infra:标准化代码 2023-02-04 09:16:33 +08:00
YunaiV
dd1ed7b81e infra:完善 logger 的单元测试 2023-02-04 09:10:18 +08:00
YunaiV
ee7cb5055c infra:完善 file 的单元测试 2023-02-04 07:50:45 +08:00
YunaiV
ac661150d7 infra:完善 dataSource 的单元测试 2023-02-04 01:15:09 +08:00
YunaiV
f620bc3fec infra:完善 config 的单元测试 2023-02-04 00:57:16 +08:00
YunaiV
df65b88fe9 system:简化 mapper 的实现 2023-02-04 00:34:03 +08:00
YunaiV
f6d259b620 system:将 biz 的方法名的负数都换成 List 2023-02-04 00:26:53 +08:00
gaibu
6f3e026f4c feat: 修改部分 swagger 注解 2023-02-04 00:19:40 +08:00
YunaiV
d5fe4a3c89 system:将 api 的方法名的负数都换成 List 2023-02-04 00:15:32 +08:00
YunaiV
85aae8587e system:将 check 方法,统一成 validate 方法 2023-02-04 00:12:26 +08:00
YunaiV
bd5706bfa1 完善 notify 单元测试 2023-02-04 00:02:46 +08:00
YunaiV
4d42b8834b 完善 mail 单元测试 2023-02-03 23:39:38 +08:00
YunaiV
5619441f61 完善 AdminUserServiceImpl 单元测试 2023-02-03 22:09:55 +08:00
gaibu
695014a6d1 feat: 升级 spring doc 依赖 2023-02-03 22:04:48 +08:00
YunaiV
6474fba923 完善 TenantServiceImpl 单元测试 2023-02-02 23:47:25 +08:00
YunaiV
9c216e5b7d 完善 TenantPackageServiceImpl 单元测试 2023-02-02 23:36:03 +08:00
YunaiV
ac25dbe286 完善 SmsCodeServiceImpl 单元测试 2023-02-02 23:16:43 +08:00
YunaiV
5a18223bc3 完善 SmsSendServiceImpl 单元测试 2023-02-02 21:15:31 +08:00
YunaiV
0d81431541 完善 SmsLogServiceImpl 单元测试 2023-02-02 21:08:40 +08:00
YunaiV
36c8448ed5 完善 SmsChannelServiceImpl 单元测试 2023-02-02 21:05:42 +08:00
YunaiV
458a042701 完善 SensitiveWordServiceImpl 单元测试 2023-02-02 21:03:00 +08:00
YunaiV
9185e5d2a0 完善 RoleServiceImpl 单元测试 2023-02-02 09:13:43 +08:00
YunaiV
71550a3c0e 完善 MenuServiceImplTest 单元测试 2023-02-01 23:33:44 +08:00
YunaiV
eadad75590 完善 OAuth2ClientServiceImpl、OAuth2GrantServiceImpl 单元测试 2023-02-01 21:06:14 +08:00
YunaiV
dfffbe3823 完善 NoticeServiceImpl 单元测试 2023-02-01 21:04:30 +08:00
YunaiV
608f177200 完善 OperateLogServiceImpl 单元测试 2023-02-01 08:27:37 +08:00
YunaiV
d60ff1688e 完善 LoginLogServiceImplTest 单元测试 2023-02-01 08:16:52 +08:00
YunaiV
589aaab298 完善 ErrorCodeServiceImpl 单元测试 2023-02-01 08:04:26 +08:00
YunaiV
0a2fbae9d8 完善 DictTypeServiceImpl 单元测试 2023-02-01 07:45:47 +08:00
YunaiV
30f097ed26 完善 DictDataServiceImpl 单元测试 2023-02-01 07:35:08 +08:00
YunaiV
6d770bba17 完善 PostServiceImpl 单元测试 2023-02-01 00:42:26 +08:00
YunaiV
7f6d64e921 完善 DeptServiceImpl 单元测试 2023-02-01 00:07:28 +08:00
YunaiV
2edf53a403 完善 AdminAuthServiceImpl 单元测试 2023-01-31 22:43:39 +08:00
YunaiV
c107095d22 新增站内信功能 2023-01-29 18:44:51 +08:00
YunaiV
aaf84aae03 1. 优化邮件的代码;2. 修复邮件在多租户下的报错 2023-01-28 20:08:03 +08:00
YunaiV
c44ecf08ff 增加邮件功能 2023-01-27 21:44:31 +08:00
YunaiV
cb111fd9ba 增加邮件功能 2023-01-27 21:30:42 +08:00
YunaiV
41bb7c6f29 Merge remote-tracking branch 'origin/master' 2023-01-25 10:51:25 +08:00
YunaiV
aa36a5c690 !378 优化代码生成列表加载速度 2023-01-25 10:51:14 +08:00
YunaiV
d2d2b5cd89 简化本地缓存的实现,萌新更容易看懂! 2023-01-25 10:12:49 +08:00
YunaiV
b43813ab96 完善脱敏组件的注释 2023-01-21 13:18:52 +08:00
芋道源码
d5e54288c1 !19 feat:脱敏组件
Merge pull request !19 from 与或非/issues/2023022001
2023-01-20 08:00:40 +00:00
gaibu
fb577ca7c1 feat:脱敏组件 2023-01-20 15:48:24 +08:00
芋道源码
a464c8058f !18 fix: 缺少导包
Merge pull request !18 from 与或非/N/A
2023-01-20 05:37:25 +00:00
与或非
f05a4e0cad fix: 缺少导包
Signed-off-by: 与或非 <1016771049@qq.com>
2023-01-20 01:51:12 +00:00
芋道源码
bf7c22e0fa !17 重构 滑块验证码实现
Merge pull request !17 from xingyu/master
2023-01-19 07:31:32 +00:00
YunaiV
6aaceb27b4 增加微信公众号接入的 README 说明 2023-01-18 00:44:38 +08:00
xingyu
4347bc793c update captcha 2023-01-17 16:59:40 +08:00
xingyu
4a7b5df1b7 chore: 1.6.6-snapshot 2023-01-17 15:50:09 +08:00
xingyu
b0b24a19d9 docs: update readme 2023-01-17 15:46:35 +08:00
xingyu
ace19f5da4 chore: update deps 2023-01-17 15:45:10 +08:00
xingyu
3449882a70 refactor: captcha-plus 2023-01-17 15:37:22 +08:00
xingyu
4f43bc2d63 feat: 升级knife4j 4.0 2023-01-17 15:30:30 +08:00
xingyu
67dd42dd16 feat: 优化 captcha 代码 2023-01-13 09:27:19 +08:00
xingyu
c98e1c14a3 fix: 修复 xss 2023-01-13 09:23:32 +08:00
YunaiV
9af01c9842 !350 配置管理,配置是否可见判断写反了 2023-01-04 22:29:32 +08:00
YunaiV
682efbe3c3 !351 升级最新依赖 && 修复树形 全部展开 全部关闭 2023-01-04 22:28:29 +08:00
YunaiV
90c727ee69 346 file路径Bug 2023-01-04 09:18:37 +08:00
YunaiV
76bed8028a 347 fix: 腾讯 COS 异常,Region 必传 2023-01-04 08:59:55 +08:00
YunaiV
8433c3ad71 【修复】没有数据权限时,添加/修改用户的唯一手机、账号等字段的校验不正确 2022-12-31 17:31:14 +08:00
YunaiV
56c13b888e 调整为 MIT 协议 2022-12-31 17:12:45 +08:00
YunaiV
362059420d 增加 yudao-cloud 架构图 2022-12-30 23:05:56 +08:00
YunaiV
cd5fc4db19 完善项目 README 说明 2022-12-30 22:10:15 +08:00
YunaiV
25bd30b28c 修复 system、bpm 服务的 druid 监控会被 spring security 拦截 2022-12-30 21:32:01 +08:00
YunaiV
ae525435b0 修复 server 代码生成的包名不对 2022-12-30 19:02:19 +08:00
YunaiV
bb4bce8389 增加配置放到 nacos 时的注意事项 2022-12-30 13:38:10 +08:00
YunaiV
380ef717d7 1. 修复 token 过期时,网关继续网关
2. 修复 swagger 重复带了前缀
3. 修复 bpm 模块的 security 配置错误
2022-12-30 12:42:20 +08:00
YunaiV
31bbcecb36 修复报错的单元测试 2022-12-30 00:27:23 +08:00
YunaiV
510de0c6d0 【新增】yudao-spring-boot-starter-biz-ip 业务组件,提供地区 & IP 库的封装 2022-12-29 23:06:16 +08:00
YunaiV
8719348c84 【修复】DeptService 的 getDeptsByParentIdFromCache 在获取部门列表时,未处理多租户场景 2022-12-29 20:19:06 +08:00
YunaiV
a38206f574 !340 修复yudao-module-system-api/ErrorCodeConstants.java中错误码重复的问题 2022-12-29 13:11:18 +08:00
YunaiV
3e8e2b1421 !337 完善vue3上传组件 && 提升打包速度 2022-12-29 13:08:33 +08:00
YunaiV
2203d8bdb9 328 fix: SQL 条件表达式缺少括号问题 2022-12-29 13:00:48 +08:00
YunaiV
7902fe5c39 【修复】字典类型逻辑删除时,唯一索引冲突的问题 2022-12-29 12:53:17 +08:00
YunaiV
e03f485591 !322 修复 vue3 代码生成 优化标签栏 2022-12-29 00:31:08 +08:00
YunaiV
3e686bb2db 优化 vue3 配置,修复部分 bug 2022-12-29 00:27:42 +08:00
YunaiV
3a9a0215b0 修复字典数据(system_dict_data)查询操作有问题,会查出不属于本字典类型(dict_type)的数据 2022-12-29 00:17:29 +08:00
YunaiV
6f8ca56e16 优化本地缓存的刷新实现,数据变更时,强制刷新 2022-12-29 00:11:11 +08:00
YunaiV
81340a636b 移出多余的 onemall 归档模块 2022-12-28 21:50:37 +08:00
芋道源码
5f513bff9f !13 升级 v1.6.5
Merge pull request !13 from xingyu/master
2022-12-01 05:48:16 +00:00
xingyu4j
0f83d0177a update v1.6.5 2022-12-01 10:50:05 +08:00
xingyu4j
80db91ea97 修复过期方法 2022-12-01 10:49:56 +08:00
YunaiV
79df30d0f8 1. 升级 spring boot 2.7.6
2. 升级 spring cloud 2021.0.5
3. 升级 spring cloud alibaba 2021.0.4.0
4. 解决新版本 Srping Cloud Gateway 重复 cors 导致报错
5. 调整 spring boot 自动配置的写法
6. 调整 spring security 配置的写法
2022-11-30 22:28:39 +08:00
YunaiV
f06e508c9d !309 fix:流程代办,日期时区转换错误 2022-11-29 22:21:44 +08:00
YunaiV
5f8c569a70 !313 修复上传七牛云无mime type问题 2022-11-29 22:16:10 +08:00
YunaiV
583cb9388a 移除云片短信渠道,解决云片的安全风险 2022-11-25 21:07:56 +08:00
YunaiV
3c244fd44d 移除云片短信渠道,解决云片的安全风险 2022-11-25 20:22:40 +08:00
YunaiV
c528a5344f 修复部分单元测试报错的问题 2022-11-13 21:08:31 +08:00
YunaiV
7a08c293dc 调整 YudaoDataPermissionAutoConfiguration 的自动配置 2022-11-13 10:07:30 +08:00
YunaiV
bb2303e789 优化,使用 @Configuration(proxyBeanMethods = false) 提升启动速度 2022-11-12 20:27:51 +08:00
YunaiV
d87343d70c 【修复】访问数据库存储的文件,path 多层级时,无法访问的问题 2022-11-12 19:37:07 +08:00
YunaiV
cdfa049cc6 【修复】swagger上传文件没有 file 参数 2022-11-12 13:46:24 +08:00
YunaiV
35f35bb1ee 【修复】跨部门审核,当申请人与审批人不在同一部门,并且审批人的数据权限为“本部门数据权限”时,审批时有异常“手机号不存在” 2022-11-12 12:17:20 +08:00
YunaiV
c33db3e60c 【优化】修改短信模板的渠道为云片时,校验 API 模板编号为整数 2022-11-12 11:02:08 +08:00
YunaiV
4b92663b5e 阿里云 OSS 解析 region 时兼容带 https 的配置 2022-11-12 10:26:15 +08:00
YunaiV
95d1c82c82 恢复【配置管理】功能,方便业务相关的配置动态修改 2022-11-12 10:16:47 +08:00
YunaiV
3c4af5210c 【移除】jasypt-spring-boot-starter 加密库使用 hutool AES 替代 2022-11-12 09:17:36 +08:00
YunaiV
b8e907ba62 标记工作流,已完成! 2022-11-12 02:33:48 +08:00
YunaiV
61e03b8141 网关日志日志功能创建的LinkedHashMap对象没有指定初始长度,可以指定以提高性能 2022-11-12 02:25:21 +08:00
YunaiV
5b538c6596 修复前端上传文件时,报未登录的错误 2022-11-12 02:17:25 +08:00
YunaiV
2d602914ac Merge branch 'master' of https://github.com/YunaiV/yudao-cloud 2022-11-12 01:27:27 +08:00
芋道源码
e73311d074 !12 解决 Cloud 的各种报错
Merge pull request !12 from 芋道源码/spring-cloud-alibaba
2022-11-11 17:25:24 +00:00
YunaiV
3c5eff5603 优化 Swagger 的实现,提升可读性 2022-11-12 01:22:43 +08:00
YunaiV
b4e68fa018 简化 Gateway Swagger 的配置,去除无用的 2022-11-11 23:16:36 +08:00
YunaiV
9399f36232 Merge branch 'master' of https://gitee.com/zhijiantianya/yudao-cloud into spring-cloud-alibaba 2022-11-11 22:55:48 +08:00
芋道源码
4d3fb9db18 !11 gateway集成Knife4j
Merge pull request !11 from zhixiong.liu/master
2022-11-11 14:55:22 +00:00
YunaiV
0f66390a2a 修复创建租户报错的问题 2022-11-11 22:31:57 +08:00
YunaiV
9dfe6d273c 解决 Gateway 的 jar 打包后无法运行的问题 2022-11-11 21:49:13 +08:00
YunaiV
fc113b640b 优化 CorsFilter 的实现 2022-11-11 21:34:07 +08:00
YunaiV
48b8a5dc78 修复滑块验证码,存在失败的情况 2022-11-11 20:48:17 +08:00
YunaiV
cb136fe143 Merge branch 'master' of https://gitee.com/zhijiantianya/yudao-cloud into spring-cloud-alibaba 2022-11-11 20:24:45 +08:00
YunaiV
41db81d0ac 修复滑块验证码,存在失败的情况 2022-11-11 20:24:28 +08:00
YunaiV
b7226f8b12 修复 yudao-module-infra-biz 单元测试的报错 2022-11-11 19:15:51 +08:00
YunaiV
8071a552f7 修复 BpmTaskAssignLeaderX2ScriptTest 单元测试的报错 2022-11-11 19:07:57 +08:00
YunaiV
57b3897eb3 1. 修复 data-permission 单元测试的报错 2022-11-11 18:57:49 +08:00
YunaiV
8c4332f47d 1. 修复 FileServiceTest 单元测试
2. 修复 FileConfigServiceImplTest 单元测试
2022-11-11 08:48:33 +08:00
YunaiV
6ed88db8a4 1. 修复 OAuth2OpenControllerTest 单元测试 2022-11-11 08:43:13 +08:00
YunaiV
de09f992bf 1. 修复 LoginLogServiceImplTest
2. 修复 OperateLogServiceImplTest
3. 修复 SmsLogServiceTest
2022-11-11 01:39:41 +08:00
YunaiV
40d3324266 修复 Spring Cloud 单元测试,插入数据不返回 id 的问题 2022-11-11 01:20:13 +08:00
YunaiV
efd42c81e0 修复 SocialUserServiceTest 单测报错 2022-11-11 00:36:41 +08:00
YunaiV
c6b8a09356 修复 SmsSendServiceTest 单元测试的报错 2022-11-11 00:30:42 +08:00
YunaiV
19d9d66a38 同步 Date 转换 LocalDateTime 的修改~ 2022-11-11 00:20:57 +08:00
YunaiV
2460e492cf 281 【轻量级 PR】:fix WXLitePayClient.java 中copy应忽略的字段 2022-11-10 22:37:37 +08:00
YunaiV
46d16c45e6 280 【轻量级 PR】:短信接收报告回调处理小Bug 2022-11-10 21:18:22 +08:00
YunaiV
26dee4026b 同步 ruoyi-vue-pro 依赖的升级 2022-11-10 13:24:37 +08:00
YunaiV
488458b631 移除优惠劵的使用逻辑 2022-11-10 13:02:50 +08:00
YunaiV
479a05b5d7 移除商品推荐的逻辑 2022-11-05 01:19:25 +08:00
YunaiV
fcea893ec9 清理优惠劵模板的逻辑 2022-11-02 23:01:53 +08:00
YunaiV
c82274821a 清理优惠劵模板的逻辑 2022-10-31 23:44:43 +08:00
YunaiV
0e6d94876d 清理价格计算相关的逻辑 2022-10-30 18:11:52 +08:00
liuzhixiong
5b73366ffa 修复验证码无法加载的问题 2022-10-27 10:34:19 +08:00
liuzhixiong
6005c4839b gateway集成Knife4j 2022-10-27 10:21:15 +08:00
YunaiV
c54b330cdf !271 升级后端及 vue3部分依赖 2022-10-17 20:44:30 +08:00
YunaiV
b5474d1d84 !257 通过注解增加多租户缓存 2022-09-24 18:24:57 +08:00
YunaiV
239c38cf64 清理已迁移的 cart 代码 2022-09-12 10:00:17 +08:00
YunaiV
a347d2a1d3 清理已迁移的 product 代码 2022-09-05 21:08:45 +08:00
芋道源码
a912dc32f4 Merge pull request #72 from YunaiV/spring-cloud-alibaba
集成aj-captcha
2022-09-04 17:16:15 +08:00
芋道源码
98ad02744b Merge pull request #71 from YunaiV/master
集成aj-captcha
2022-09-04 17:15:28 +08:00
芋道源码
3e8b2d7d58 !10 集成aj-captcha
Merge pull request !10 from 芋道源码/spring-cloud-alibaba
2022-09-04 09:10:56 +00:00
YunaiV
6b4bc47d08 !246 集成aj-captcha 2022-09-04 17:06:12 +08:00
YunaiV
e99138493b !258 修复导入用户后编辑报错 2022-09-03 10:23:22 +08:00
YunaiV
16fd9dc425 移除已经迁移的商城代码 2022-08-25 08:16:01 +08:00
YunaiV
e5c4c747a4 代码生成功能中,点击同步,会清除已添加并存在的字段 2022-08-19 20:04:56 +08:00
YunaiV
29fff03f93 代码生成的el-dialog默认添加 v-dialogDrag属性(可拖拽移动) 2022-08-18 22:30:51 +08:00
YunaiV
193110e456 清理 address 相关的代码 2022-08-01 23:39:58 +08:00
芋道源码
2923ae216d !7 更新pr,只提交gateway跨域问题
Merge pull request !7 from fengyuan/master
2022-07-30 02:54:09 +00:00
YunaiV
2c28e11631 完整移除 activiti 遗留的东东 2022-07-29 22:49:53 +08:00
YunaiV
0f886b0446 fix:短信验证码的每日发送条数不正确 2022-07-29 00:57:38 +08:00
YunaiV
6343627c2c fix: test、stage、prod 不打印日志的问题 2022-07-29 00:46:13 +08:00
fengyuan
3d07628050 解决跨域问题 2022-07-28 21:32:31 +08:00
芋道源码
03c4f65081 Merge pull request #65 from YunaiV/spring-cloud-alibaba
增加工作流的功能
2022-07-27 00:56:48 +08:00
芋道源码
7755c6a77b !6 增加工作流的功能
Merge pull request !6 from 芋道源码/spring-cloud-alibaba
2022-07-26 16:55:22 +00:00
YunaiV
38270be962 feat:增加 bpm 工作流的能力 2022-07-27 00:54:09 +08:00
YunaiV
03d3c8b5a8 feat: Druid升级至1.2.11 2022-07-27 00:17:27 +08:00
YunaiV
27588467a2 feat: add vue3 codegen(preview) 2022-07-27 00:12:15 +08:00
YunaiV
da13b91b66 fix: #I5II34 hutool error 2022-07-27 00:09:13 +08:00
YunaiV
ab4ad6c2b7 fix: spring admin prefer-ip 过期 2022-07-27 00:06:56 +08:00
YunaiV
9b785369ab update: springboot 2.6.8 ==> 2.6.9
update: hutool 5.6.1 ==> 5.7.22
2022-07-27 00:05:55 +08:00
YunaiV
1b84f3f1ea bugfix:解决用户 Token 过期时,因为 Mono.empty() 导致返回空的 Response 的问题 2022-07-26 23:49:43 +08:00
YunaiV
f1cf5f9f88 refactor: 时间区间查询传入数组 2022-07-26 23:10:31 +08:00
YunaiV
55adb8efa9 优化文件的 type 识别与存储 2022-07-10 00:02:32 +08:00
YunaiV
34ea1db585 优化文件的 type 识别与存储 2022-07-10 00:00:56 +08:00
YunaiV
fec84f2682 基于 tika 识别文件类型 2022-07-08 21:30:08 +08:00
YunaiV
33e5c2a7f9 Redis 缓存的查询与删除 2022-07-08 20:46:30 +08:00
YunaiV
30e323dc9a 1. 【新增】接口支持通过 @PermitAll 注解,允许匿名(未登录)进行访问
2. 【新增】`yudao.security.permit-all-urls` 配置项,允许匿名(未登录)进行访问
2022-07-06 21:45:59 +08:00
YunaiV
b37e593ada 优化管理后台的社交登录 2022-07-05 22:01:01 +08:00
芋道源码
51c6ad1fd9 Merge pull request #62 from YunaiV/spring-cloud-alibaba
Spring Cloud Alibaba 完成 system 和 infra 的迁移
2022-06-26 22:12:06 +08:00
芋道源码
ff055e5a2c !4 Spring Cloud Alibaba 完成 system 和 infra 的迁移
Merge pull request !4 from 芋道源码/spring-cloud-alibaba
2022-06-26 14:10:29 +00:00
YunaiV
441330e455 同步最新文档的地址 2022-06-26 22:09:08 +08:00
YunaiV
9ce0814e2b 同步最新文档的地址 2022-06-26 21:00:22 +08:00
YunaiV
0ed12d1615 同步 SQL 文件 2022-06-26 11:07:30 +08:00
YunaiV
ecd5d607a8 TokenAuthenticationFilter 优化本地缓存的实现 2022-06-26 00:26:22 +08:00
YunaiV
ef1096f56a TokenAuthenticationFilter 增加本地缓存 2022-06-25 23:55:22 +08:00
YunaiV
d79514d821 禁止网关直接传输 login-user 2022-06-25 22:50:33 +08:00
YunaiV
97b931f782 完善 gateway 服务,支持 tag 过滤服务实例 2022-06-25 22:36:12 +08:00
YunaiV
b8fb106aaf 完善 yudao-spring-boot-starter-rpc 组件,增加 Dubbo 自定义的异常 Filter 2022-06-25 22:10:47 +08:00
YunaiV
917746a1a7 完善 yudao-spring-boot-starter-env 组件,完成 dubbo 组件 2022-06-25 22:01:38 +08:00
YunaiV
2faaa65325 完善 yudao-spring-boot-starter-env 组件,完成 registry 组件 2022-06-25 21:36:11 +08:00
YunaiV
d0ce24a2f6 完善 yudao-spring-boot-starter-env 组件,完成 feign 组件 2022-06-25 20:58:07 +08:00
YunaiV
f879c4aa2b 增加 yudao-spring-boot-starter-env 组件,完成 tag 请求头的读取到上下文 2022-06-25 17:18:47 +08:00
YunaiV
fcfa66100c 暂时移除 mall-spring-boot-starter-sentry 的封装 2022-06-25 15:17:00 +08:00
YunaiV
3012ff84a2 【新增】集成 Prometheus 监控点 2022-06-25 15:10:15 +08:00
YunaiV
b47e5d4c5d 【新增】yudao.error-code.enable 错误码的开关,默认在 local 环境关闭自动生成错误码 2022-06-25 11:10:09 +08:00
YunaiV
383ff130b9 【新增】yudao.access-log.enable 访问日志的开关,默认在 local 环境关闭记录访问日志 2022-06-25 10:50:05 +08:00
YunaiV
3774afe553 完成 xxl-job 的接入 2022-06-25 10:18:04 +08:00
YunaiV
4381d938be 1. 接入 spring cloud stream,支持多租户
2. 弱化 spring cloud dubbo 集成,可通过加入依赖自动实现
2022-06-22 23:59:19 +08:00
YunaiV
4807547d73 system 服务:sms 短信完成 MQ 改造 2022-06-21 08:23:31 +08:00
YunaiV
9945b5fcd0 infra 服务:集成 spring-cloud-starter-bus-rocketmq 组件 2022-06-21 08:15:13 +08:00
YunaiV
6dd514b84a 集成 spring-cloud-starter-bus-rocketmq 组件 2022-06-19 00:37:44 +08:00
YunaiV
7b36eca609 集成 spring-cloud-starter-stream-rocketmq 组件 2022-06-18 22:02:11 +08:00
YunaiV
6471c4641d 集成 spring-cloud-starter-stream-rocketmq 组件 2022-06-18 17:46:11 +08:00
YunaiV
d150a8333d 新增 yudao-spring-boot-starter-banner 组件,用于项目启动时打印开发文档、接口文档等 2022-06-18 09:22:38 +08:00
YunaiV
d35fc522bc 解决 application-local.yaml 配置无法加载,是 jasypt 集成在 cloud 的 bug 2022-06-18 01:14:11 +08:00
YunaiV
89848cebf3 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件 2022-06-18 00:37:54 +08:00
YunaiV
2bd40cfb3b 新增 yudao-spring-boot-starter-biz-error-code 错误码组件 2022-06-18 00:11:46 +08:00
YunaiV
ca28d791aa 增加 CommonResult 的 check 逻辑 2022-06-17 23:54:42 +08:00
YunaiV
ff18d2f30a 清理归档下,已经迁移的逻辑 2022-06-17 20:39:21 +08:00
YunaiV
e20600f0c2 基于 Guava 实现 tenant 租户数据的本地缓存 2022-06-17 20:28:50 +08:00
YunaiV
31c24cd340 基于 Guava 实现 dict 字典数据的本地缓存 2022-06-17 19:50:57 +08:00
YunaiV
0045602e6b 增加 SecurityFrameworkServiceImpl 的缓存,提升性能 2022-06-17 08:36:36 +08:00
YunaiV
5c04c9eeaf 增加 TenantFrameworkServiceImpl 的缓存,提升性能 2022-06-17 07:53:05 +08:00
YunaiV
5598f62456 完成 TenantApi 的 feign 支持 2022-06-16 22:14:08 +08:00
YunaiV
71930d492e 将 onemall 老代码,统一到归档目录,后续不断迁移移除 2022-06-16 09:06:44 +08:00
YunaiV
64c478a45b 移除 yudao-spring-boot-starter-extension 2022-06-16 09:03:08 +08:00
YunaiV
97bcee429b 完成 AdminUserApi、SocialUserApi 的 feign 支持 2022-06-16 08:52:05 +08:00
YunaiV
cca4c9fceb 完成 SmsCodeApi、SmsSendApi 的 feign 支持 2022-06-16 08:08:19 +08:00
YunaiV
b52a38d297 完成 RoleApi、PermissionApi 的 feign 支持 2022-06-15 23:14:44 +08:00
YunaiV
84744938be 完成 LoginLogApi、DictDataApi 的 feign 支持 2022-06-15 22:59:06 +08:00
YunaiV
2f1234cda8 完成 DeptApi、PostApi 的 feign 支持 2022-06-15 21:51:53 +08:00
YunaiV
9b3092b3fd 完成 FileApi 的 feign 支持 2022-06-15 21:05:08 +08:00
YunaiV
4c6e915def 优化 yudao-spring-boot-starter-web 的 API 日志封装,和 yudao-cloud 保持一致 2022-06-14 13:42:30 +08:00
YunaiV
284ee5000a 优化 yudao-spring-boot-starter-biz-operatelog 的封装,和 yudao-cloud 保持一致 2022-06-13 23:05:36 +08:00
YunaiV
8174916c92 精简 system-service-project 项目 2022-06-12 00:14:09 +08:00
YunaiV
b1149279c0 简化 application.yaml 和 bootstrap.yaml 等配置文件 2022-06-11 23:58:41 +08:00
YunaiV
f08fe24174 2. tenant 组件:feign 调用时,通过 header 透传 Tenant 信息 2022-06-11 23:13:58 +08:00
YunaiV
ca6e7a4528 1. 增加 RPC starter
2. security 组件:feign 调用时,通过 header 透传 LoginUser 信息
2022-06-11 22:24:15 +08:00
YunaiV
0cf1738c0a 清理冗余的代码 2022-06-11 21:54:30 +08:00
YunaiV
ea7ad4b1ca infra:勉强启动成功,需要继续优化 2022-06-10 21:02:59 +08:00
YunaiV
0745ad9254 framework:移除 yudao-spring-boot-starter-extension 2022-06-09 09:55:34 +08:00
YunaiV
6d5d72999b infra:初始化 infra 服务的启动,还有一些报错,正在处理 2022-06-08 10:16:04 +08:00
YunaiV
213ec8bd72 gateway:完整实现 AccessLogFilter 访问日志 2022-06-08 01:13:49 +08:00
YunaiV
b2fc171609 gateway:完善 AccessLogFilter 的注释 2022-06-08 00:04:02 +08:00
YunaiV
88352fe065 gateway:优化 AccessLogFilter 访问日志 2022-06-07 23:31:34 +08:00
YunaiV
f4c83c0168 gateway:增加访问日志,待优化~ 2022-06-06 01:04:42 +08:00
YunaiV
f32e43863b 1. gateway 增加灰度路由 2022-06-05 20:22:27 +08:00
YunaiV
78c200ca61 1. gateway:接入 nacos 配置中心,可支持动态路由
2. system-server:接入 nacos 配中心
2022-06-04 23:50:46 +08:00
YunaiV
93f4334eb6 gateway:增加 GlobalExceptionHandler 实现全局异常处理 2022-06-04 21:23:47 +08:00
YunaiV
bfb15aea09 gateway 完成使用 TokenAuthenticationFilter 实现身份验证的功能 2022-06-04 19:14:35 +08:00
YunaiV
e5fed46ae1 gateway 引入 webclient,实现对 oauth2 接口的调用 2022-06-04 10:06:09 +08:00
YunaiV
6d9195ac83 引入 spring cloud dubbo 依赖,实现 dubbo + rest 双协议 2022-06-03 19:35:14 +08:00
YunaiV
13936b39aa 修复 system 的 rpc 服务的 swagger 不分信息不展示的问题 2022-06-03 19:04:24 +08:00
YunaiV
0fcd30bbfd 1. 临时提交,system 的 rpc 服务的 swagger 注解的实现 2022-06-03 17:46:54 +08:00
YunaiV
e89ef5496c 1. system 提供 OAuth2TokenApi 接口
2. gateway 通过 feign 引入 OAuth2TokenApi 接口
2022-06-03 01:11:13 +08:00
YunaiV
94d62b8d79 1. gateway 引入 nacos 依赖,实现服务的注册发现
2. gateway 引入 loadbalancer 依赖,实现服务的负载均衡
2022-06-02 23:43:34 +08:00
YunaiV
9bb0422c1c 1. 引入 Spring Cloud Alibaba Nacos
2. 移除基于 apollo 实现的 nacos
2022-06-02 22:28:37 +08:00
YunaiV
5b2616fac1 初始化 system 服务 2022-06-02 09:29:35 +08:00
YunaiV
12e2ce99e1 初始化 spring cloud 项目的 system 和 infra 模块 2022-06-01 23:59:01 +08:00
YunaiV
fcc5180ebf 初始化网关项目 2022-05-06 01:31:24 +08:00
zhuyang
48bd0c1b3c 启动成功 2021-10-17 00:38:55 +08:00
zhuyang
db27985036 system改造 2021-10-13 17:07:09 +08:00
zhuyang
341404eafa 优惠改造 2021-10-09 22:56:43 +08:00
zhuyang
af8f9745e9 支付改造 2021-10-09 22:23:15 +08:00
zhuyang
001892824c 交易改造 2021-10-09 22:10:39 +08:00
zhuyang
b5480816ef 搜索改造 2021-10-09 21:49:56 +08:00
zhuyang
53a33e4999 ProductSku改造 2021-10-07 23:55:34 +08:00
zhuyang
50d8aac20f ProductCategory改造 2021-10-07 23:45:17 +08:00
zhuyang
b5b102d13f ProductBrand改造 2021-10-07 23:30:17 +08:00
zhuyang
a01d66a318 ProductAttr改造 2021-10-07 23:14:30 +08:00
zhuyang
4f50845b66 1. ProductSPU 迁移springcloud.
2. 调用方manager通过feign调用spu api
2021-10-07 16:50:40 +08:00
zhuyang
c50f99e7b3 SPU.get接口改造 2021-10-06 22:50:17 +08:00
YunaiV
30e2d08784 增加环境搭建文档 2021-02-21 19:28:48 +08:00
YunaiV
4e926d8d1a Dubbo Provider 增加统一的版本号 2020-12-05 23:31:44 +08:00
YunaiV
0eeb4b3add 修改 Redis,连接服务器上的 2020-12-05 23:26:39 +08:00
YunaiV
9fb182e21a 1. 访问令牌,增加 Redis 作为缓存
2. 删除多余的 order 代码
2020-12-05 23:13:39 +08:00
YunaiV
03fde3699b 1. 增加 Redis Starter
2. 在 system-service-app 引入 Redis Starter
2020-12-05 19:49:59 +08:00
YunaiV
49250ebf45 1. 增加支付交易分页 API 接口 2020-12-01 00:45:49 +08:00
YunaiV
efaeb5b39d 1. 增加 XXL-Job starter
2. 迁移 pay 服务的 Job 逻辑
2020-11-30 18:47:57 +08:00
YunaiV
04f53da686 将支付成功、退款成功的 MQ 消费逻辑进行迁移 2020-11-30 01:28:30 +08:00
YunaiV
63b4c27c8f 完成 pingxx 支付回调接口 2020-11-30 01:07:28 +08:00
YunaiV
0285bf50fb 将 user-web-app 合并到 shop-web-app 中,简化项目数量 2020-11-29 21:24:10 +08:00
YunaiV
9345166422 1. 将需要迁移的代码,统一移到 moved 目录下 2020-11-29 01:51:05 +08:00
YunaiV
c60f9c71bf 1. 迁移支付交易的提交 RPC 接口
2. 迁移支付交易的获取 RPC 接口
2020-11-29 01:43:30 +08:00
YunaiV
d1b6118052 1. 迁移三方 PayClient 的代码 2020-11-28 23:32:51 +08:00
YunaiV
0a14b530b6 1. 迁移创建支付交易单接口 2020-11-28 22:52:52 +08:00
YunaiV
fdc83d4550 1. 迁移交易订单的查询接口
2. 支付服务,重新初始化结构
2020-11-27 18:38:39 +08:00
YunaiV
db4ee1ed7e 1. 订单服务,修改为交易服务
2. 迁移订单创建 rpc 接口
2020-11-26 18:40:07 +08:00
YunaiV
8f8f4d72b5 修改 shop-web-app 增加监控依赖 2020-08-27 01:13:29 +08:00
YunaiV
e0d7731626 修改 shop-web-app 增加监控依赖 2020-08-27 01:09:59 +08:00
YunaiV
c208456bc2 修复 dev 配置文件的配置中心不对~ 2020-08-27 01:04:58 +08:00
YunaiV
671d4ad246 修改 README 文档~ 2020-08-26 23:59:36 +08:00
YunaiV
e0ab6b8462 增加令牌刷新逻辑
增加演示模式的开关
2020-08-26 20:47:46 +08:00
YunaiV
54325da259 修改 management-web-app 的打包~ 2020-08-25 19:12:33 +08:00
YunaiV
709b85e453 Banner 的迁移
商品推荐的迁移
2020-08-25 18:51:04 +08:00
YunaiV
f0999eac46 Banner 的迁移
商品推荐的迁移
2020-08-24 20:14:06 +08:00
YunaiV
c94fae173e 促销活动代码迁移 2020-08-22 23:48:31 +08:00
YunaiV
42c6389023 优惠劵模板相关逻辑的迁移 2020-08-22 18:33:57 +08:00
YunaiV
60b0043a78 优惠劵模板相关逻辑的迁移 2020-08-22 17:58:52 +08:00
YunaiV
6fd899bca2 优惠劵模板相关逻辑的迁移 2020-08-22 13:49:38 +08:00
YunaiV
cb0c7744ac 优惠劵模板相关逻辑的迁移 2020-08-21 22:32:52 +08:00
YunaiV
b5e939fdb4 优惠劵相关逻辑的迁移 2020-08-20 23:45:44 +08:00
YunaiV
5b3c464faf 优惠劵相关逻辑的迁移 2020-08-20 19:47:29 +08:00
YunaiV
2c6331eb75 修复 promotion dev 环境配置错误的 db 2020-08-15 19:44:44 +08:00
YunaiV
274352613a promotion 增加 actuator 依赖 2020-08-15 19:40:40 +08:00
YunaiV
4bfb7c2e04 清理部分 cart 冗余代码~ 2020-08-15 19:31:53 +08:00
YunaiV
9fb421360f 完成购物车的修改~ 2020-08-15 18:27:55 +08:00
YunaiV
8818b350d6 Price 价格服务的编写 2020-08-15 15:37:53 +08:00
YunaiV
5122b68aca Price 价格服务的编写 2020-08-14 19:09:17 +08:00
YunaiV
ed71f5e9c8 Price 价格服务的编写 2020-08-12 20:05:48 +08:00
YunaiV
84cc2728bd 迁移 cart 的 web api
解决 promotion-service 模块的启动
2020-08-07 19:12:00 +08:00
YunaiV
5714ddcbe8 迁移购物车模块 2020-08-07 07:40:20 +08:00
YunaiV
b57b2bc931 Merge branch 'master-new' of https://gitee.com/zhijiantianya/onemall into master-new 2020-08-06 21:13:41 +08:00
YunaiV
3914b32637 迁移购物车模块 2020-08-06 21:13:21 +08:00
hccake
81fef80c51 提供 sentry-stater 2020-08-06 14:14:19 +08:00
YunaiV
d06e51ba21 删除已经迁移完的商品代码 2020-08-05 01:00:35 +08:00
YunaiV
dfd25c1516 修改 search 服务的 dev dubbo 配置
完成 product 详情 rest 接口
2020-08-05 00:21:51 +08:00
YunaiV
11b2f67ed1 增加商品详情 RPC 接口 2020-08-04 22:08:37 +08:00
YunaiV
7697c8b0c0 增加 search 服务打包时的监控检查 2020-08-04 20:32:32 +08:00
YunaiV
b83262af5f 完成的商品搜索和条件功能 2020-08-04 19:42:54 +08:00
YunaiV
f3316d14c7 初始化商品分页接口 2020-08-04 08:12:08 +08:00
YunaiV
5acf1ae3d4 解决依赖不正确的问题 2020-08-03 23:39:30 +08:00
hccake
e7a7f4293f 🎨 MybatisPlusAutoConfiguration package move 2020-08-03 22:04:09 +08:00
hccake
cb28f67b8d ⬆️ mybatis-plus up to 3.3.2 & mybatis up to 3.5.4 2020-08-03 21:52:48 +08:00
hccake
973a923bf8 mybatis-plus 扩展,批量插入支持 2020-08-03 21:50:50 +08:00
YunaiV
128b9dc21a 迁移搜索服务 2020-08-03 20:38:12 +08:00
YunaiV
72ed490334 修改 product-service-app 的 dev 的注册中心的配置 2020-08-02 22:59:06 +08:00
YunaiV
d970591a78 修改 user-service-app 的 dev 的注册中心的配置 2020-08-02 22:54:27 +08:00
YunaiV
27a5dd3555 设置最终 build 的名字,解决打包问题 2020-08-02 22:36:59 +08:00
YunaiV
d739c34e6c 设置最终 build 的名字,解决打包问题 2020-08-02 01:09:20 +08:00
YunaiV
c71defa8fb 设置最终 build 的名字,解决打包问题 2020-08-02 00:57:39 +08:00
YunaiV
777133bd49 设置最终 build 的名字,解决打包问题 2020-08-02 00:56:15 +08:00
YunaiV
cbbd2ea017 临时注释掉 promotion-service-project 项目,避免 jenkins 编译不通过 2020-08-01 23:38:00 +08:00
YunaiV
1daf0dd8cc system-service-app 增加 actuator 监控端点 2020-08-01 23:19:47 +08:00
YunaiV
c6c838d759 优化 user 认证 starter,支持忽略部分 url 2020-08-01 20:19:49 +08:00
YunaiV
da826a21c9 修改 user-service-app 导入的数据库脚本 2020-08-01 18:47:40 +08:00
YunaiV
d0ce6090ad 修改 system-service-app 导入的数据库脚本 2020-08-01 17:37:25 +08:00
YunaiV
8646d0a69e Merge remote-tracking branch 'origin/master' into master-new 2020-07-31 00:33:25 +08:00
YunaiV
0252bd0f0b 迁移完成商品搜索的插入 2020-07-31 00:33:20 +08:00
YunaiV
981b3d87e2 开始迁移搜索服务 2020-07-30 22:38:14 +08:00
YunaiV
d88da8229f Merge branch 'master-new' of https://gitee.com/zhijiantianya/onemall into master-new 2020-07-30 01:15:35 +08:00
YunaiV
72347c8149 商品规格的迁移 2020-07-30 01:13:08 +08:00
wuwenbin
495bf2ed58 fix promotion优惠券工程继续迁移,未完成,再再再提交下 2020-07-29 22:48:41 +08:00
YunaiV
90047c10d7 商品规格 value 的迁移 2020-07-28 23:58:09 +08:00
YunaiV
7dbbd412d8 商品规格 key 的迁移 2020-07-28 23:15:20 +08:00
YunaiV
75876682fb 进行商品修改的迁移 2020-07-28 20:10:03 +08:00
YunaiV
e107b42f53 进行商品添加的迁移 2020-07-27 20:07:23 +08:00
YunaiV
be4b34c884 完成商品 spu 分页的迁移 2020-07-27 06:45:38 +08:00
wuwenbin
9a9407641c fix promotion优惠券工程继续迁移,未完成,再再提交下 2020-07-26 17:52:41 +08:00
wuwenbin
67f8b61f47 fix promotion优惠券工程继续迁移,未完成,再提交下 2020-07-26 17:45:01 +08:00
wuwenbin
ac5ab0b70b Merge remote-tracking branch 'origin/master-new' into master-new 2020-07-26 16:42:43 +08:00
YunaiV
d503d8b2fc Merge branch 'master-new' of https://gitee.com/zhijiantianya/onemall into master-new 2020-07-26 11:04:51 +08:00
YunaiV
e87cb91332 商品 SPU 开始迁移 2020-07-26 11:04:32 +08:00
wuwenbin
7aa25e8342 fix promotion优惠券工程迁移,未完成,先提交下 2020-07-26 10:05:47 +08:00
wuwenbin
ef015d9e4c fix promotion优惠券工程迁移 2020-07-26 10:04:42 +08:00
YunaiV
de81e5f5ae 增加 c 端读取商品分类的接口 2020-07-26 01:12:22 +08:00
YunaiV
24f3e697b8 商品品牌的迁移,准备和前端管理后台对接 2020-07-25 22:29:38 +08:00
YunaiV
2b8459680b 商品分类的迁移,完成并测试 2020-07-25 19:31:02 +08:00
Autorun
b1313bf52e !3 dependency version field fix
Merge pull request !3 from Autorun/master-new
2020-07-25 14:56:45 +08:00
mijiu
a61613aca4 Merge remote-tracking branch 'origin/master-new' into master-new 2020-07-25 13:08:03 +08:00
mijiu
41996876ca 交易 2020-07-25 13:07:03 +08:00
YunaiV
a99afdc833 商品分类的迁移,继续未完成,继续先提交下~ 2020-07-25 00:10:10 +08:00
autorun
305eed408c add system-service-api dependency version field.
Solve the problem of compilation failure
2020-07-24 22:12:13 +08:00
YunaiV
b209505f99 商品分类的迁移,未完成,先提交下~ 2020-07-24 18:55:51 +08:00
YunaiV
4198c154aa Merge branch 'master-new' of https://gitee.com/zhijiantianya/onemall into master-new 2020-07-24 18:53:18 +08:00
YunaiV
e0edc2d2d9 修改 address 提交参数 2020-07-24 09:12:38 +08:00
leo
6465e5e30a 支付模块 2020-07-24 00:42:23 +08:00
YunaiV
84d4e604b1 继续迁移用户收件地址的代码 2020-07-23 19:02:33 +08:00
YunaiV
6ae48b6543 开始迁移用户收件地址,清理部分代码~ 2020-07-23 08:12:42 +08:00
YunaiV
25047e081c 完成用户管理的功能开发 2020-07-23 07:27:52 +08:00
YunaiV
ef1354478e 用户的功能迁移 2020-07-22 20:15:44 +08:00
YunaiV
8edc49f4e7 进一步完善 Dubbo 路由封装 2020-07-22 07:26:09 +08:00
YunaiV
92c2d79dc1 1. 重新实现 Dubbo 路由的过滤器,之前的版本有问题
2. Spring Cloud Alibaba Dubbo 的 URL 处理有问题,切回到 Dubbo 原生注册中心,不使用 Spring Cloud 注册中心
2020-07-21 19:45:58 +08:00
YunaiV
1dadf93449 Dubbo 路由规则的过滤器实现 2020-07-21 08:07:11 +08:00
YunaiV
e6201b00c1 错误码的管理的迁移 2020-07-20 20:29:41 +08:00
YunaiV
187b17ed01 错误码的 Starter 的初始化,完成 2020-07-20 19:18:27 +08:00
YunaiV
0df486a677 错误码的 Starter 的初始化,暂未完成 2020-07-19 22:13:17 +08:00
YunaiV
e04c9584e3 修改 Dubbo Exception Filter 的处理,针对系统异常,还是直接抛出 2020-07-19 03:55:44 +08:00
YunaiV
c0407267b9 完善 Dubbo Provider 异常过滤器,接入新的异常体系 2020-07-19 01:34:44 +08:00
YunaiV
32c1cfb3a7 system-service 服务,接入新的错误码 2020-07-19 00:41:30 +08:00
YunaiV
4397cbe643 重构错误码的设计,第一次提交~ 2020-07-18 20:12:52 +08:00
YunaiV
c5596919f5 完善 Dubbo Provider 统一异常过滤器 2020-07-17 20:59:47 +08:00
YunaiV
e3f2e15c43 bom 文件调整 2020-07-17 19:59:43 +08:00
YunaiV
26ea8dd907 开启 Dubbo Provider 参数校验 2020-07-17 08:19:29 +08:00
YunaiV
d619f0fae8 开启 Dubbo Consumer 参数校验 2020-07-17 07:53:24 +08:00
YunaiV
3b5199b60b 处理 SpringMVC 全局处理 2020-07-16 19:39:49 +08:00
YunaiV
02dda60e60 系统异常日志模块的迁移 2020-07-16 09:04:18 +08:00
YunaiV
42e30bf380 提供初始化表结构 2020-07-15 20:15:21 +08:00
YunaiV
4ed8d5fcf2 访问日志的管理功能的迁移 2020-07-15 20:11:04 +08:00
YunaiV
e1e42c0ce0 数据字典模块完成 2020-07-15 08:48:24 +08:00
YunaiV
ac9d5f32f7 修复管理员禁用的 BUG 2020-07-14 21:03:46 +08:00
YunaiV
f8cfb32b13 删除已迁移的代码 2020-07-14 19:37:20 +08:00
YunaiV
846510c309 部门模块的迁移 2020-07-14 19:31:27 +08:00
YunaiV
244f248ad5 完全权限模块的权限注册的添加 2020-07-13 22:45:31 +08:00
YunaiV
61e5cfe617 完成角色权限分配功能的迁移 2020-07-13 19:24:42 +08:00
YunaiV
99c591d6f9 完成角色权限分配功能的迁移 2020-07-13 09:26:00 +08:00
YunaiV
d34e555aa0 重构,增加 Permission 相关模块,更加清晰 2020-07-13 07:50:07 +08:00
YunaiV
2daea0060d 将当前管理员相关的信息、权限等接口,迁移到 Passport 模块,更加统一 2020-07-12 15:06:58 +08:00
YunaiV
74d05557e1 移除 user-mobile 项目,迁移到单独的工程 2020-07-11 21:15:49 +08:00
YunaiV
6d1a47afea 移除 admin-web 项目,迁移到单独的工程 2020-07-11 20:56:59 +08:00
YunaiV
40fe027753 增加查询当前登陆管理员的基本信息的接口 2020-07-09 23:22:06 +08:00
YunaiV
3a23ca72e6 完成资源列表的前端对接和调整 2020-07-09 09:00:59 +08:00
YunaiV
6bddebafff 增加管理员拥有的菜单列表 2020-07-08 20:21:55 +08:00
YunaiV
e4d3254869 完成角色模块的改造 2020-07-08 13:07:12 +08:00
YunaiV
eee0444e81 完成角色模块的改造 2020-07-08 00:08:32 +08:00
YunaiV
4c4708cc8f 完成资源模块的改造 2020-07-07 21:14:35 +08:00
YunaiV
8af7b252aa 接入 IDEA REST Client 插件 2020-07-05 23:14:57 +08:00
YunaiV
cf7cedbd06 接入 IDEA REST Client 插件 2020-07-05 23:05:01 +08:00
YunaiV
3be27d0648 完成管理后台的 admin 相关接口 2020-07-05 22:22:45 +08:00
YunaiV
51a5e5b750 迁移管理员逻辑 2020-07-05 18:28:14 +08:00
YunaiV
6a4b6fe67f 创建 mall-spring-boot-starter-security-admin 模块,用于管理员的认证拦截器 2020-07-05 00:10:55 +08:00
YunaiV
93c646890d 创建 mall-spring-boot-starter-security-user 模块,用于用户的认证拦截器 2020-07-04 23:25:22 +08:00
YunaiV
d89e5bad98 admin-web 接入新的登陆接口 2020-07-04 21:35:15 +08:00
YunaiV
41514100e0 将 mall-spring-boot-starter-swagger 接入到 management-web-app 中 2020-07-04 21:08:37 +08:00
YunaiV
301e2c5720 将 mall-spring-boot-starter-web 接入新的 system-service 服务 2020-07-04 21:00:34 +08:00
Aliu
61564c7798 add LICENSE. 2020-07-04 20:32:32 +08:00
YunaiV
c1ca5f7dc5 完成管理员登陆接口的测试 2020-07-04 17:13:57 +08:00
YunaiV
bedaaf0999 完整管理员登陆接口的开发 2020-07-04 16:20:33 +08:00
YunaiV
ee6fa2b805 准备开始迁移管理员相关模块 2020-07-04 10:29:25 +08:00
YunaiV
20d8db6ce8 完成 oauth2.0 的逻辑 2020-07-04 09:42:24 +08:00
YunaiV
dfd1360b28 重新初始化 system 服务 2020-07-03 23:40:14 +08:00
YunaiV
3cbd872497 完成快速登录功能,以及自测。 2020-07-03 20:42:35 +08:00
YunaiV
3d6bd5e4ee 重写用户快速登录逻辑 2020-07-03 19:12:56 +08:00
YunaiV
ee7cf3e871 重新调整结构的测试 2020-07-02 23:06:17 +08:00
YunaiV
8121aee460 重新调整结构的测试 2020-07-02 19:06:32 +08:00
YunaiV
1e4ef483a7 迁移新服务器,修改配置文件 2020-07-01 19:23:55 +08:00
xiaofeng
25c3b3cb89 添加获取订单评论详情 2020-06-01 23:57:47 +08:00
xiaofeng
3803170b34 核对了下pom 包,和其它的模块都是一样的引入,之前的报错重新刷新一下MAVEN试一下。 2020-05-26 13:18:45 +08:00
xiaofeng
ca0b887c60 添加订单评价分页--Mongodb 2020-05-24 16:23:12 +08:00
benpaodeyouyusi
76c19d7a75 错误码分组 2020-05-23 12:39:07 +08:00
benpaodeyouyusi
4293fde5ad 添加分组 2020-05-22 15:42:33 +08:00
lihailong
ffd4fd82a8 1.迁移product search 代码
2.先注释掉提示错误的代码,后续相关人员开发功能时自行解开
3.修改es连接方式为 rest,增加spring data jest
2020-05-20 18:44:33 +08:00
lihailong
1e8057b04e - 增加: spring-boot-starter-data-jest依赖 2020-05-20 18:17:25 +08:00
xiaofeng
c8a7e35731 添加订单评论和MONGODB 2020-05-19 23:28:19 +08:00
jwf1173
e47029cff2 商品分类review 修改 2020-05-16 16:43:41 +08:00
YunaiV
c34c501fb8 banner、商品、商品分类等代码的 REVIEW 2020-05-15 18:45:47 +08:00
cherishsince
16a39255f9 - 优化代码 2020-05-15 18:22:05 +08:00
cherishsince
0c198e8f08 - 优化:增加注释,优化格式 2020-05-15 18:18:41 +08:00
hccake
20e65bf2f7 🎨 操作日志功能:生产日志部分 2020-05-15 15:44:22 +08:00
hccake
7dbe420d8d 添加hutool-all依赖,减少工具类重复开发 2020-05-15 15:41:29 +08:00
cherishsince
4f095309fd - 优化:total 改为long类型 2020-05-14 17:03:51 +08:00
cherishsince
230ace1959 - 优化:pageResult 和 mybatis 返回的 total 保持一致(改为long型) 2020-05-14 17:01:43 +08:00
cherishsince
7fcf954649 - 增加:banner 2020-05-14 17:01:10 +08:00
cherishsince
e629319d8b - 初始化:promotion 项目结构 2020-05-14 14:18:23 +08:00
cherishsince
963dffb862 - 修改:application old 改为 start 2020-05-14 14:17:53 +08:00
cherishsince
83ccd6729f - 重新优化:RPC 调用,暂时只公开 getAddress 和 getDefaultAddress 2020-05-14 14:07:30 +08:00
jwf1173
5733a56e68 用户信息review调整 2020-05-14 08:55:35 +08:00
2447007062
e013cbcdbc Merge remote-tracking branch 'origin/master' 2020-05-13 23:17:03 +08:00
2447007062
bc507a4754 增加系统日志查询功能 2020-05-13 22:51:06 +08:00
sunderui
211164d4d1 sku add 2020-05-13 22:14:30 +08:00
YunaiV
4580f61489 商品、订单相关代码的 Review 2020-05-13 19:06:19 +08:00
jwf1173
03857426aa 调整商品模块结构 2020-05-12 18:23:27 +08:00
jwf1173
a29fb12b8a 新增管理后台对用户信息相关操作 2020-05-12 17:56:31 +08:00
jwf1173
6d86e349ef Merge branch 'master' of https://gitee.com/zhijiantianya/onemall 2020-05-12 14:34:02 +08:00
jwf1173
333f0707bb 修改商品controller层级 2020-05-12 14:33:46 +08:00
cherishsince
34623fd775 - 修改:promotion 放出来 2020-05-12 14:29:13 +08:00
cherishsince
6956489862 - 优化:解决 idea 提示,泛型需要指定类型 2020-05-12 14:28:47 +08:00
xiaofeng
e04798d48a 1.迁移order service 代码
2.先注释掉提示错误的代码,后续相关人员开发功能时自行解开
2020-05-11 23:57:16 +08:00
linhj
bea0228357 :construction:​ review done 修改提示 2020-05-11 23:52:30 +08:00
xiaofeng
966375beda 迁移order service 代码 2020-05-11 23:43:44 +08:00
wuwenbin
ee735c0ec4 fix redis 缓存客户端,包括jedis,redisson,spring-data-redis 2020-05-11 23:02:34 +08:00
wuwenbin
cce62c43f4 Merge remote-tracking branch 'origin/master' 2020-05-11 22:11:51 +08:00
sunderui
23251cb187 review--->edit 2020-05-11 22:06:36 +08:00
YunaiV
a8bc6754c2 商品品牛排和规格,代码 REVIEW 2020-05-11 21:55:53 +08:00
YunaiV
b45739d151 错误码模块,代码 REVIEW 2020-05-11 21:45:16 +08:00
YunaiV
b227928135 商品分类,代码 REVIEW 完成 2020-05-11 19:25:50 +08:00
q2118cs
08f3d35573 product brand 2020-05-11 18:22:12 +08:00
linhj
055d204ded 🚧 商品包调整 2020-05-11 18:12:13 +08:00
q2118cs
b996ddfa1e product-sku-rpc 2020-05-11 16:26:02 +08:00
q2118cs
a4ca27d68c 商品规格接口 2020-05-11 15:41:54 +08:00
benpaodeyouyusi
a00c4eb054 Merge branch 'master' of gitee.com:zhijiantianya/onemall 2020-05-10 23:38:31 +08:00
benpaodeyouyusi
96858fae21 错误码第一版续,分组暂时未加,第二版会添加分组和mq订阅 2020-05-10 23:38:20 +08:00
wuwenbin
e21d19502f Merge remote-tracking branch 'origin/master'
# Conflicts:
#	pom.xml
2020-05-10 20:28:17 +08:00
jiangweifan
382a4e8d6e product新增订阅system服务 2020-05-09 23:37:16 +08:00
jiangweifan
88a3cd8d02 system及product启动调试商品分类,修改配置 2020-05-09 23:36:17 +08:00
benpaodeyouyusi
413f75f402 Merge branch 'master' of gitee.com:zhijiantianya/onemall 2020-05-09 21:19:34 +08:00
benpaodeyouyusi
b24e45947b 错误码第一版 2020-05-09 21:19:17 +08:00
xiaofeng
58d9b76d2d Merge remote-tracking branch 'origin/master' 2020-05-08 23:13:30 +08:00
xiaofeng
249dc086c6 1.迁移application代码
2.更改实体后缀为request、response
2020-05-08 23:12:48 +08:00
ShiSanYe
845911f412 再次测试提交名字 2020-05-08 22:42:53 +08:00
tangjunye@126.com
eb7c52b7b4 测试提交名字 2020-05-08 22:40:54 +08:00
“admin”
ecd75df0d4 统一修改promotion类引用父类的路径 2020-05-08 22:38:32 +08:00
xiaofeng
956bdb5396 修改订单模块项目结构 2020-05-08 22:30:30 +08:00
wuwenbin
f6c0a8a8aa fix 新增缓存模块 2020-05-08 22:26:16 +08:00
xiaofeng
104e33f5f9 对接我的收藏接口 2020-05-08 22:11:10 +08:00
jiangweifan
b6498b4483 调整请求参数校验 2020-05-08 12:48:58 +08:00
jiangweifan
0c328605b7 商品分类review修改 2020-05-08 12:07:18 +08:00
cherishsince
a3cbccecd6 - 优化,重新设定 .editorconfig 规则 2020-05-08 11:05:11 +08:00
cherishsince
43935d3e1e - 增加字符集,设定为 utf-8 2020-05-08 11:02:24 +08:00
fansili
748fe31cfe - 优化:修改 pom以来
- 删除:systemError 改为 useError
2020-05-08 10:43:54 +08:00
fansili
739afb86e3 - 优化:error 实现 ServiceExceptionUtil.Enumerable 2020-05-08 10:43:14 +08:00
fansili
09eba0d21d - 优化:增加 @Valid 2020-05-08 10:36:58 +08:00
fansili
c4474b6ced - 吧 promotion 放出来 2020-05-08 10:34:52 +08:00
fansili
311fa087c6 优化:移动 response 和 request 目录 2020-05-08 10:32:02 +08:00
fansili
cf4c3ad66d - 优化 2020-05-08 10:29:40 +08:00
fansili
6b2213d580 - 增加:增加 rest api(用户地址) 2020-05-08 10:28:38 +08:00
fansili
4ec0864626 - 修改:todo 2020-05-08 09:35:46 +08:00
fansili
fffdd4466b - 打开用户模块 2020-05-08 09:34:23 +08:00
YunaiV
80c8dd3553 商品分类,代码 REVIEW 2020-05-08 07:32:22 +08:00
jiangweifan
016600ab2e 新增- 商品分类更新,商品分类状态更新,商品分类删除接口 2020-05-07 19:07:30 +08:00
jiangweifan
20f2ad7416 迁移商品分类树节点及创建商品分类 2020-05-07 00:01:03 +08:00
YunaiV
9da9a50b92 用户收件地址的代码 review 2020-05-06 19:52:18 +08:00
q2118cs
4669e81645 调整product服务项目结构,商品规格列表接口 2020-05-06 17:04:38 +08:00
YunaiV
9f3dc3c087 修改数据库的密码,反正需要连接到内网才可以访问 2020-05-05 21:35:02 +08:00
cherishsince
fb75521bc6 - 处理:TODO
- 删除:userAddress 移动到 user 模块
2020-05-03 20:50:02 +08:00
cherishsince
174b19723a - 迁移:UserAddress 2020-05-03 20:49:20 +08:00
YunaiV
3c5486c80a review 收件地址
review 短信模块,部分代码
2020-05-02 20:18:27 +08:00
cherishsince
83d9afd3d0 - 增加:qiniu 文件服务 2020-05-02 08:38:05 +08:00
YunaiV
157b166435 迁移 system 服务,admin 逻辑 2020-05-01 11:04:16 +08:00
cherishsince
2543d95d0e - 增加:注释 2020-05-01 10:56:33 +08:00
cherishsince
7c8393292e - 优化 2020-05-01 10:50:17 +08:00
cherishsince
00e958266b - 优化结构:添加 address default enum. 2020-05-01 10:49:28 +08:00
cherishsince
f605775ba7 - 提交:address .xml 2020-05-01 10:48:47 +08:00
cherishsince
47d4d3f2dc - 优化:userErrorCode 改为 SystemErrorCode 2020-05-01 10:48:27 +08:00
cherishsince
16d5bc3cf7 - 增加:用户 address 错误码 2020-05-01 10:47:59 +08:00
cherishsince
84f94459e1 - 修改结构:用户地址 2020-05-01 10:45:12 +08:00
cherishsince
c40b43eda4 - 修改结构:用户地址 2020-05-01 10:43:58 +08:00
cherishsince
4e6d3ff382 - 优化:AdminErrorCodeEnum.java 改为 SystemErrorCodeEnum 2020-05-01 09:38:00 +08:00
cherishsince
952fdf08a7 - 展开:sms 错误码 2020-05-01 09:15:54 +08:00
cherishsince
5513b767dc - 优化:跳转 request 目录 2020-05-01 09:14:51 +08:00
cherishsince
cf77478fb5 - 优化:移动目录 2020-05-01 09:12:14 +08:00
cherishsince
35b50f79aa - 移动:目录 2020-05-01 09:10:37 +08:00
cherishsince
b7ed9e116c - 修改:错误码 2020-05-01 09:06:24 +08:00
cherishsince
6e5254e737 - 优化:sms client 重命名 2020-05-01 08:57:39 +08:00
YunaiV
e4048f8716 1. 迁移角色相关逻辑
2. admin-web 接入角色新接口
2020-04-29 21:57:09 +08:00
YunaiV
0763551d6d 1. 迁移角色相关逻辑
2. admin-web 接入角色新接口
2020-04-29 00:42:33 +08:00
YunaiV
4e5b6ff2cf 1. 迁移角色相关逻辑 2020-04-28 09:25:29 +08:00
YunaiV
4e38bf75ca 1. 解决项目无法启动的问题
2. 注释掉暂未在重构中的项目。
2020-04-27 23:30:37 +08:00
YunaiV
a279495936 1. system 提供新的 Resource 相关接口
2. admin-web 接入新的 Resource 相关接口
2020-04-27 22:40:12 +08:00
YunaiV
f7157d283c 1. system 提供新的 Resource 相关接口
2. admin-web 接入新的 Resource 相关接口
2020-04-27 19:48:58 +08:00
YunaiV
caf605063c 1. admin-web 接入管理员资源集合
2. system 迁移管理员资源接口
2020-04-27 00:21:37 +08:00
YunaiV
983c01d709 1. admin-web 接入菜单
2. system 迁移菜单接口
2020-04-27 00:08:28 +08:00
YunaiV
18180b3a01 1. admin-web 接入新的登陆接入 2020-04-26 19:52:14 +08:00
YunaiV
eb86ae7cbc 1. 完成 auth 鉴权逻辑
2. 完成 admin 获取 Admin 上下文
3. 完成 user 获取 User 上下文
2020-04-23 21:18:48 +08:00
YunaiV
a545d673ab 增加 auth 授权相关处理(未完成) 2020-04-22 21:57:26 +08:00
YunaiV
6f37500f62 增加 auth 认证拦截器(未完全) 2020-04-21 23:55:36 +08:00
YunaiV
eec8f0860e 增加 auth 认证拦截器 2020-04-21 23:21:03 +08:00
YunaiV
6bcad5d53f 完善 Access Log 的记录 2020-04-21 08:41:30 +08:00
YunaiV
cc9696938a 创建新 user 服务项目 2020-04-20 22:58:12 +08:00
YunaiV
bdff67b7b3 增加访问日志的 dubbo 实现 2020-04-20 19:55:39 +08:00
cherishsince
e36b32a97d - 修改结构:短信 smsSign
- 修改结构:短信 smsTemplate
2020-04-20 11:36:44 +08:00
cherishsince
ac86ca2a13 - 优化:代码过长 2020-04-20 09:53:14 +08:00
cherishsince
0c987989fd - 修改结构:OSS 七牛 2020-04-20 09:52:58 +08:00
cherishsince
e431f169fb - 添加:OSS 打包 2020-04-20 09:51:56 +08:00
YunaiV
57145d426e 增加 swagger starter 2020-04-20 08:29:09 +08:00
YunaiV
220984c45b 增加 user 使用 mobile 认证的逻辑 2020-04-19 22:43:14 +08:00
YunaiV
f4a698bc57 迁移 user 模块的发送短信功能到 system 模块 2020-04-17 21:41:06 +08:00
YunaiV
4ffc2cb815 开始重构 system 模块的代码,先修改认证逻辑 2020-04-17 19:25:24 +08:00
芋道源码
233a441579 Merge pull request #7 from DeligentNezha/patch-1
Update ServiceExceptionUtil.java
2020-04-17 04:02:27 -05:00
芋道源码
ff6b6e667f Merge pull request #21 from YunaiV/dependabot/npm_and_yarn/mobile-web/vant-2.2.14
Bump vant from 1.6.28 to 2.2.14 in /mobile-web
2020-04-14 10:35:00 -05:00
YunaiV
3734f141c6 修复 API 文档地址 2020-04-14 21:50:17 +08:00
YunaiV
6c3c025bfc 修改文档信息 2020-04-14 20:47:04 +08:00
YunaiV
954979b586 Merge branch 'master' of https://github.com/YunaiV/onemall into feature-sca-1.0.0 2020-04-14 20:25:38 +08:00
YunaiV
059dbc6c79 1. 引入 Spring Cloud Sentinel,后续做进一步集成
2. 重新搭建 Elasticsearch 服务,并接入 search 服务
2020-04-14 20:10:40 +08:00
YunaiV
90391664cc 解决 product 报错的问题,修改成 product 服务依赖 user 服务 2020-04-14 07:48:08 +08:00
YunaiV
4dc0e6aead 去除 user 服务,对 product 服务的依赖。
目前 product 服务会报错,稍后修复
2020-04-13 23:01:47 +08:00
YunaiV
0761607bef 1. 修复 seata 配置错误
2. 引入 Spring Cloud Stream RocketMQ 依赖
2020-04-13 22:39:50 +08:00
YunaiV
3dd7f2d0af 1. 搭建新的 Nacos 服务,并替换配置文件
2. 引入 Spring Cloud Stream RocketMQ 依赖,并接入 product 模块
2020-04-13 20:39:12 +08:00
YunaiV
d0ae7e61b3 需改 Spring Cloud Sentinel 的依赖情况。 2020-04-12 20:49:55 +08:00
YunaiV
3b49aff5a4 将 search 模块接入 SCA Dubbo 和 Nacos Discovery 组件 2020-04-12 20:36:29 +08:00
YunaiV
60db9b9a77 将 order 模块接入 SCA Dubbo 和 Nacos Discovery 组件,同时将 Seata 修改成 SCA Seata 组件 2020-04-12 20:30:44 +08:00
YunaiV
4a2870e8e5 将 promotion 模块接入 SCA Dubbo 和 Nacos Discovery 组件,同时将 Seata 修改成 SCA Seata 组件 2020-04-12 20:10:16 +08:00
YunaiV
ac2ee0a1e9 将 user 模块接入 SCA Dubbo 和 Nacos Discovery 组件 2020-04-12 19:54:03 +08:00
YunaiV
a0e9687f1b 将 pay 模块接入 SCA Dubbo 和 Nacos Discovery 组件,同时将 Seata 修改成 SCA Seata 组件 2020-04-12 19:39:49 +08:00
YunaiV
8aedbbc5b4 将 product 模块接入 SCA Dubbo 和 Nacos Discovery 组件,同时将 Seata 修改成 SCA Seata 组件 2020-04-12 19:18:32 +08:00
YunaiV
a248a4b3b4 将 system 模块接入 SCA Dubbo 和 Nacos Discovery 组件。 2020-04-11 23:13:00 +08:00
YunaiV
363f6b208d 开始接入 Spring Cloud Alibaba,同时启动新测服 2020-04-10 20:56:50 +08:00
dependabot[bot]
eda5facc53 Bump vant from 1.6.28 to 2.2.14 in /mobile-web
Bumps [vant](https://github.com/youzan/vant) from 1.6.28 to 2.2.14.
- [Release notes](https://github.com/youzan/vant/releases)
- [Commits](https://github.com/youzan/vant/compare/v1.6.28...v2.2.14)

Signed-off-by: dependabot[bot] <support@github.com>
2019-11-22 14:01:29 +00:00
Radical
31b0bd081e Update ServiceExceptionUtil.java
自定义一个接口,声明方法getCode(),枚举实现这个接口并实现getCod()方法返回枚举实例的code,此处error方法的参数声明为该接口类型,然后error方法内部调用getCode方法获取code,这样,对于error方法来说,使用更安全了,避免传一个不存在的code,调用error方法的地方直接传枚举即可,省去大量枚举.getCode()调用,其他方法同,不知道我说清楚了么
2019-06-13 18:27:09 +08:00
3143 changed files with 121847 additions and 204351 deletions

View File

@@ -1,11 +1,10 @@
root=true
[*.java]
[*.{adoc,bat,groovy,html,java,js,jsp,kt,kts,md,properties,py,rb,sh,sql,svg,txt,xml,xsd}]
charset = utf-8
[*.{groovy,java,kt,kts,xml,xsd}]
indent_style = space
indent_size = 4
continuation_indent_size = 8
[*.xml]
indent_style = space
indent_size = 4
continuation_indent_size = 4
end_of_line = lf

View File

@@ -0,0 +1,25 @@
碰到问题,请在 <https://gitee.com/zhijiantianya/yudao-cloud/issues> 搜索是否存在相似的 issue。
不按照模板提交的 issue会被系统自动删除。
### 基本信息
- ruoyi-vue-pro 版本:
- 操作系统:
- 数据库:
### 你猜测可能的原因
(必填)我花费了 2-4 小时自查发现可能的原因是xxxxxx
### 复现步骤
第一步,
第二步,
第三步,
### 报错信息
带上必要的截图

34
.github/ISSUE_TEMPLATE/question.md vendored Normal file
View File

@@ -0,0 +1,34 @@
---
name: 问题反馈
about: 请详细描述,以便更高快的获得到解决
title: ''
labels: ''
assignees: ''
---
碰到问题,请在 <https://github.com/YunaiV/yudao-cloud/issues> 搜索是否存在相似的 issue。
不按照模板提交的 issue会被系统自动删除。
### 基本信息
- ruoyi-vue-pro 版本:
- 操作系统:
- 数据库:
### 你猜测可能的原因
(必填)我花费了 2-4 小时自查发现可能的原因是xxxxxx
### 复现步骤
第一步,
第二步,
第三步,
### 报错信息
带上必要的截图

30
.github/workflows/maven.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
on:
push:
branches: [ master ]
# pull_request:
# branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '8', '11', '17' ]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.Java }}
uses: actions/setup-java@v2
with:
java-version: ${{ matrix.java }}
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml -Dmaven.test.skip=true

20
LICENSE Normal file
View File

@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2021 yudao-cloud
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

456
README.md
View File

@@ -1,214 +1,322 @@
[toc]
**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!**
# 前言
**「我喜欢写代码,乐此不疲」**
**「我喜欢做开源,以此为乐」**
基于微服务的思想,构建在 B2C 电商场景下的项目实战
我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献
* 「Talk is cheap. Show me the code」屁话少说放码过来
> 我们看过很多技术文章,却依然不知道微服务该咋整。
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
* 这会是一个认真做的业务开源项目,目前 Java 代码 2w+ 行,不包括注释的情况下。
## 🐶 新手必读
* 整体的功能如下图:![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png)
> 功能图,和实际后端模块拆分,并不是绝对对应。
* [功能列表 - H5 商城](https://gitee.com/zhijiantianya/onemall/blob/master/docs/guides/%E5%8A%9F%E8%83%BD%E5%88%97%E8%A1%A8/%E5%8A%9F%E8%83%BD%E5%88%97%E8%A1%A8-H5%20%E5%95%86%E5%9F%8E.md)
* [功能列表 - 管理后台](https://gitee.com/zhijiantianya/onemall/blob/master/docs/guides/%E5%8A%9F%E8%83%BD%E5%88%97%E8%A1%A8/%E5%8A%9F%E8%83%BD%E5%88%97%E8%A1%A8-%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0.md)
* 演示地址:<http://dashboard.yudao.iocoder.cn>
* 启动文档:<https://cloud.iocoder.cn/quick-start/>
* 视频教程:<https://cloud.iocoder.cn/video/>
* 交流群:[传送门](http://www.iocoder.cn/mall-user-group/?vip&gitee)
> 一起交流Get 知识。
## 🐯 平台简介
* 我们迫切希望更多的参与进来,可以加入「交流群」,一起骚聊
* [《Onemall 电商开源项目 —— 应用分层》](http://www.iocoder.cn/Onemall/Application-layer/?vip&onemall)
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用
# 近期计划
近期准备开发如下功能:
> 🔥 :近期会更新新的项目分层结构。
1. 微信 H5 网页登陆 @To0R𓃰
2. 订单评价 @wang171776704
3. 商品品牌 @黑子
4. 短信接入 @小范
5. 访问日志、错误日志接入
6. 会员资料 @nengjie
7. 拼团购买 @大太阳
8. 部门管理 @Tprotect曦
9. 商品收藏 @笑笑生
# 演示
> 艿艿:目前的开发者,都是后端出身。所以,一帮没有审美自觉的人,撸出来的前端界面,可能是东半球倒数第二难看。
> 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。
>
> 迫切希望,有前端能力不错的小伙伴,加入我们,一起来完善「一个商城」。
> 😜 给项目点点 Star 吧,这对我们真的很重要!
![架构图](https://static.iocoder.cn/yudao-cloud-architecture.png?imageView2/2/format/webp)
* 管理后台的 Vue3 版本采用 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin) Vue2 版本采用 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
* 管理后台的移动端采用 [uni-app](https://github.com/dcloudio/uni-app) 方案,一份代码多终端适配,同时支持 APP、小程序、H5
* 后端采用 Spring Cloud Alibaba 微服务架构,注册中心 + 配置中心 Nacos消息队列 RocketMQ定时任务 XXL-Job服务保障 Sentinel服务网关 Gateway分布式事务 Seata
* 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等,基于 MyBatis Plus、Redis + Redisson 操作
* 权限认证使用 Spring Security & Token & Redis支持多终端、多种用户的认证系统支持 SSO 单点登录
* 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能
* 支持 SaaS 多租户系统,可自定义每个租户的权限,提供透明化的多租户底层封装
* 工作流使用 Flowable支持动态表单、在线设计流程、会签 / 或签、多种任务分配方式
* 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验
* 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款
* 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务
* 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏
## 🐳 项目关系
![架构演进](https://static.iocoder.cn/yudao-roadmap.png?imageView2/2/format/webp)
三个项目的功能对比,可见社区共同整理的 [国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) 表格。
### 后端项目
| 项目 | Star | 简介 |
|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
| [ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro) | 基于 Spring Boot 多模块架构 |
| [yudao-cloud](https://gitee.com/zhijiantianya/yudao-cloud) | [![Gitee star](https://gitee.com/zhijiantianya/yudao-cloud/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/yudao-cloud) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/yudao-cloud.svg?style=social&label=Stars)](https://github.com/YunaiV/yudao-cloud) | 基于 Spring Cloud 微服务架构 |
| [Spring-Boot-Labs](https://gitee.com/yudaocode/SpringBoot-Labs) | [![Gitee star](https://gitee.com/yudaocode/SpringBoot-Labs/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/yudao-cloud) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/SpringBoot-Labs.svg?style=social&label=Stars)](https://github.com/yudaocode/SpringBoot-Labs) | 系统学习 Spring Boot & Cloud 专栏 |
### 前端项目
| 项目 | Star | 简介 |
|----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------|
| [yudao-ui-admin-vue3](https://gitee.com/yudaocode/yudao-ui-admin-vue3) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-admin-vue3/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-admin-vue3) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-admin-vue3.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-admin-vue3) | 基于 Vue3 + element-plus 实现的管理后台 |
| [yudao-ui-admin-vben](https://gitee.com/yudaocode/yudao-ui-admin-vben) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-admin-vben/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-admin-vben) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-admin-vben.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-admin-vben) | 基于 Vue3 + vben(ant-design-vue) 实现的管理后台 |
| [yudao-ui-admin](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/yudao-ui-admin) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/yudao-ui-admin) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/yudao-ui-admin) | 基于 Vue2 + element-ui 实现的管理后台 |
| [yudao-ui-admin-uniapp](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/yudao-ui-admin-uniapp) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/yudao-ui-admin-uniapp) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/yudao-ui-admin-uniapp) | 基于 uni-app + uni-ui 实现的管理后台的小程序 |
| [yudao-ui-go-view](https://gitee.com/yudaocode/yudao-ui-go-view) | [![Gitee star](https://gitee.com/yudaocode/yudao-ui-go-view/badge/star.svg?theme=white)](https://gitee.com/yudaocode/yudao-ui-go-view) [![GitHub stars](https://img.shields.io/github/stars/yudaocode/yudao-ui-go-view.svg?style=social&label=Stars)](https://github.com/yudaocode/yudao-ui-go-view) | 基于 Vue3 + naive-ui 实现的大屏报表 |
| [yudao-ui-app](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/yudao-ui-app) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/yudao-ui-app) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/yudao-ui-app) | 基于 uni-app + uview 实现的用户 App |
## 😎 开源协议
**为什么推荐使用本项目?**
① 本项目采用比 Apache 2.0 更宽松的 [MIT License](https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE) 开源协议,个人与企业可 100% 免费使用不用保留类作者、Copyright 信息。
② 代码全部开源,不会像其他项目一样,只开源部分代码,让你无法了解整个项目的架构设计。[国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn)
![开源项目对比](https://static.iocoder.cn/project-vs.png?imageView2/2/format/webp/w/1280)
③ 代码整洁、架构整洁,遵循《阿里巴巴 Java 开发手册》规范代码注释详细57000 行 Java 代码22000 行代码注释。
## 🤝 项目外包
我们也是接外包滴,如果你有项目想要外包,可以微信联系【**Aix9975**】。
团队包含专业的项目经理、架构师、前端工程师、后端工程师、测试工程师、运维工程师,可以提供全流程的外包服务。
项目可以是商城、SCRM 系统、OA 系统、物流系统、ERP 系统、CMS 系统、HIS 系统、支付系统、IM 聊天、微信公众号、微信小程序等等。
## 🐼 内置功能
系统内置多种多种业务功能,可以用于快速你的业务系统:
![功能分层](https://static.iocoder.cn/ruoyi-vue-pro-biz.png?imageView2/2/format/webp)
* 系统功能
* 基础设施
* 工作流程
* 支付系统
* 会员中心
* 数据报表
* 商城系统
* 微信公众号
> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。
>
> 啊啊啊!我好像做店铺装修功能
> * 额外新增的功能,我们使用 🚀 标记
> * 重新实现的功能,我们使用 ⭐️ 标记。
## H5 商城
🙂 所有功能,都通过 **单元测试** 保证高质量。
[体验传送门](http://h5.shop.iocoder.cn:18099)
### 系统功能
![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif)
| | 功能 | 描述 |
|-----|-------|---------------------------------|
| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 |
| ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 |
| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 |
| | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 |
| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 |
| | 岗位管理 | 配置系统用户所属担任职务 |
| 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 |
| 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 |
| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 |
| 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 |
| 🚀 | 邮件管理 | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台 |
| 🚀 | 站内信 | 系统内的消息通知,提供站内信模版、站内信消息 |
| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
| ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 |
| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 |
| | 通知公告 | 系统通知公告信息发布维护 |
| 🚀 | 敏感词 | 配置系统敏感词,支持标签分组 |
| 🚀 | 应用管理 | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 |
| 🚀 | 地区管理 | 展示省份、城市、区镇等城市信息,支持 IP 对应城市 |
## 管理后台
### 工作流程
[体验传送门](http://admin.shop.iocoder.cn:18099)
| | 功能 | 描述 |
|-----|-------|----------------------------------------|
| 🚀 | 流程模型 | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 |
| 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 |
| 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 |
| 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 |
| 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 |
| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 |
| 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 |
* 账号yudaoyuanma
* 密码yudaoyuanma
### 支付系统
| | 功能 | 描述 |
|-----|------|---------------------------|
| 🚀 | 商户信息 | 管理商户信息,支持 Saas 场景下的多商户功能 |
| 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 |
| 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 |
| 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 |
ps核心功能已经实现正在对接微信小程序中...
### 基础设施
| | 功能 | 描述 |
|-----|----------|----------------------------------------------|
| 🚀 | 代码生成 | 前后端代码的生成Java、Vue、SQL、单元测试支持 CRUD 下载 |
| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 |
| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 |
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 |
| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 |
| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
| 🚀 | 文件服务 | 支持将文件存储到 S3MinIO、阿里云、腾讯云、七牛云、本地、FTP、数据库等 |
| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
| | MySQL 监控 | 监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈 |
| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
| 🚀 | 消息队列 | 基于 Redis 实现消息队列Stream 提供集群消费Pub/Sub 提供广播消费 |
| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 |
| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 |
| 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 |
| 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 |
| 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 |
| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 |
| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 |
### 数据报表
| | 功能 | 描述 |
|-----|----------|----------------------------------------------|
| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 |
| 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 |
### 微信公众号
| | 功能 | 描述 |
|-----|--------|-------------------------------|
| 🚀 | 账号管理 | 配置接入的微信公众号,可支持多个公众号 |
| 🚀 | 数据统计 | 统计公众号的用户增减、累计用户、消息概况、接口分析等数据 |
| 🚀 | 粉丝管理 | 查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作 |
| 🚀 | 消息管理 | 查看粉丝发送的消息列表,可主动回复粉丝消息 |
| 🚀 | 自动回复 | 自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复 |
| 🚀 | 标签管理 | 对公众号的标签进行创建、查询、修改、删除等操作 |
| 🚀 | 菜单管理 | 自定义公众号的菜单,也可以从公众号同步菜单 |
| 🚀 | 素材管理 | 管理公众号的图片、语音、视频等素材,支持在线播放语音、视频 |
| 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 |
| 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 |
### 商城系统
建设中...
![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png)
![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-admin-min.gif)
## 其它演示
![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif)
下面,我们会提供目前用到的中间件的管理平台。
### 会员中心
> 艿艿:考虑到大家可以看到更全的功能,所以一般提供 admin 账号。所以,大家素质使用哟。
和「商城系统」一起开发
**SkyWalking UI**
## 🐨 技术栈
* 地址http://skywalking-ui.shop.iocoder.cn:18099
* 管理员账号admin / admin
### 微服务
**Grafana UI**
| 项目 | 说明 |
|--------------------------------------------------------------------------|--------------------|
| `yudao-dependencies` | Maven 依赖版本管理 |
| `yudao-framework` | Java 框架拓展 |
| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
| `yudao-module-system` | 系统功能的 Module 模块 |
| `yudao-module-member` | 会员中心的 Module 模块 |
| `yudao-module-infra` | 基础设施的 Module 模块 |
| `yudao-module-bpm` | 工作流程的 Module 模块 |
| `yudao-module-pay` | 支付系统的 Module 模块 |
| `yudao-module-mall` | 商城系统的 Module 模块 |
| `yudao-module-mp` | 微信公众号的 Module 模块 |
| `yudao-module-report` | 大屏报表 Module 模块 |
* 地址http://grafana.shop.iocoder.cn:18099
* 演示账号yudaoyuanma / yudaoyuanma
* 用于展示 Prometheus 收集的 Metrics 指标数据。
### 框架
**Dubbo Admin**
| 框架 | 说明 | 版本 | 学习指南 |
|---------------------------------------------------------------------------------------------|------------------|-------------|---------------------------------------------------------------------|
| [Spring Cloud Alibaba](https://github.com/alibaba/spring-cloud-alibaba) | 微服务框架 | 2021.0.4.0 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
| [Nacos](https://github.com/alibaba/nacos) | 配置中心 & 注册中心 | 2.0.4 | [文档](https://www.iocoder.cn/categories/Nacos/?yudao) |
| [RocketMQ](https://github.com/apache/rocketmq) | 消息队列 | 4.9.4 | [文档](https://www.iocoder.cn/categories/RocketMQ/?yudao) |
| [Sentinel](https://github.com/alibaba/sentinel) | 服务保障 | 1.8.6 | [文档](https://www.iocoder.cn/categories/Sentinel/?yudao) |
| [XXL Job](https://github.com/xuxueli/xxl-job) | 定时任务 | 2.3.1 | [文档](https://www.iocoder.cn/XXL-JOB/good-collection/?yudao) |
| [Spring Cloud Gateway](https://github.com/spring-cloud/spring-cloud-gateway) | 服务网关 | 3.4.1 | [文档](https://www.iocoder.cn/categories/Spring-Cloud-Gateway/?yudao) |
| [Seata](https://github.com/seata/seata) | 分布式事务 | 1.6.1 | [文档](https://www.iocoder.cn/categories/Seata/?yudao) |
| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | |
| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.16 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) |
| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.0 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
| [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | |
| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.7.2 | [文档](https://doc.iocoder.cn/bpm/) |
| [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 4.0.0 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
| [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.12.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) |
| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.7.10 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | |
| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.3.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.26 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.8.2 | - |
| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.8.0 | - |
* 地址http://dubbo-admin.shop.iocoder.cn:18099
* 管理员账号:无需登陆
## 🐷 演示图
**RocketMQ Console**
### 系统功能
* 地址http://rocketmq-console.shop.iocoder.cn:18099
* 管理员账号admin / RPsa2GHjTNs8pxEU
| 模块 | biu | biu | biu |
|------------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|
| 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) |
| 用户 & 应用 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280) | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280) |
| 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - |
| 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | - |
| 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | - |
| 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | - |
| 短信 | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280) | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) |
| 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280) |
| 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | - |
**Sentinel Console**
### 工作流程
* 地址http://sentinel.shop.iocoder.cn:18099
* 账号sentinel / sentinel
| 模块 | biu | biu | biu |
|---------|------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
| 流程模型 | ![流程模型-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-列表.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-设计](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-设计.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-定义](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-定义.jpg?imageView2/2/format/webp/w/1280) |
| 表单 & 分组 | ![流程表单](https://static.iocoder.cn/images/ruoyi-vue-pro/流程表单.jpg?imageView2/2/format/webp/w/1280) | ![用户分组](https://static.iocoder.cn/images/ruoyi-vue-pro/用户分组.jpg?imageView2/2/format/webp/w/1280) | - |
| 我的流程 | ![我的流程-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-列表.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-发起.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-详情.jpg?imageView2/2/format/webp/w/1280) |
| 待办 & 已办 | ![任务列表-审批](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-审批.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-待办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-待办.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-已办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-已办.jpg?imageView2/2/format/webp/w/1280) |
| OA 请假 | ![OA请假-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-列表.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-发起.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-详情.jpg?imageView2/2/format/webp/w/1280) |
**XXL-Job Console**
### 基础设施
* 地址http://job-console.shop.iocoder.cn:18099
* 管理员账号admin / 233666
| 模块 | biu | biu | biu |
|---------------|----------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------|
| 代码生成 | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg?imageView2/2/format/webp/w/1280) | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg?imageView2/2/format/webp/w/1280) | - |
| 文档 | ![系统接口](https://static.iocoder.cn/images/ruoyi-vue-pro/系统接口.jpg?imageView2/2/format/webp/w/1280) | ![数据库文档](https://static.iocoder.cn/images/ruoyi-vue-pro/数据库文档.jpg?imageView2/2/format/webp/w/1280) | - |
| 文件 & 配置 | ![文件配置](https://static.iocoder.cn/images/ruoyi-vue-pro/文件配置.jpg?imageView2/2/format/webp/w/1280) | ![文件管理](https://static.iocoder.cn/images/ruoyi-vue-pro/文件管理2.jpg?imageView2/2/format/webp/w/1280) | ![配置管理](https://static.iocoder.cn/images/ruoyi-vue-pro/配置管理.jpg?imageView2/2/format/webp/w/1280) |
| 定时任务 | ![定时任务](https://static.iocoder.cn/images/ruoyi-vue-pro/定时任务.jpg?imageView2/2/format/webp/w/1280) | ![任务日志](https://static.iocoder.cn/images/ruoyi-vue-pro/任务日志.jpg?imageView2/2/format/webp/w/1280) | - |
| API 日志 | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg?imageView2/2/format/webp/w/1280) | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg?imageView2/2/format/webp/w/1280) | - |
| MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg?imageView2/2/format/webp/w/1280) | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg?imageView2/2/format/webp/w/1280) | - |
| 监控平台 | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.jpg?imageView2/2/format/webp/w/1280) | ![链路追踪](https://static.iocoder.cn/images/ruoyi-vue-pro/链路追踪.jpg?imageView2/2/format/webp/w/1280) | ![日志中心](https://static.iocoder.cn/images/ruoyi-vue-pro/日志中心.jpg?imageView2/2/format/webp/w/1280) |
# 技术
### 支付系统
## 搭建环境
| 模块 | biu | biu | biu |
|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
| 商家 & 应用 | ![商户信息](https://static.iocoder.cn/images/ruoyi-vue-pro/商户信息.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-列表.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-编辑.jpg?imageView2/2/format/webp/w/1280) |
| 支付 & 退款 | ![支付订单](https://static.iocoder.cn/images/ruoyi-vue-pro/支付订单.jpg?imageView2/2/format/webp/w/1280) | ![退款订单](https://static.iocoder.cn/images/ruoyi-vue-pro/退款订单.jpg?imageView2/2/format/webp/w/1280) | --- |
[搭建调试环境](https://gitee.com/zhijiantianya/onemall/blob/master/docs/setup/quick-start.md)
### 数据报表
## 架构图
| 模块 | biu | biu | biu |
|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
| 报表设计器 | ![数据报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-数据报表.jpg?imageView2/2/format/webp/w/1280) | ![图形报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-图形报表.jpg?imageView2/2/format/webp/w/1280) | ![报表设计器-打印设计](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-打印设计.jpg?imageView2/2/format/webp/w/1280) |
| 大屏设计器 | ![大屏列表](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-列表.jpg?imageView2/2/format/webp/w/1280) | ![大屏预览](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-预览.jpg?imageView2/2/format/webp/w/1280) | ![大屏编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-编辑.jpg?imageView2/2/format/webp/w/1280) |
TODO 此处应有一个架构图的装逼 JPG 图。
### 移动端(管理后台)
## 项目结构
| biu | biu | biu |
|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
| ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/01.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/02.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/03.png?imageView2/2/format/webp) |
| ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/04.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/05.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/06.png?imageView2/2/format/webp) |
| ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/07.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/08.png?imageView2/2/format/webp) | ![](https://static.iocoder.cn/images/ruoyi-vue-pro/admin-uniapp/09.png?imageView2/2/format/webp) |
| 模块 | 名称 | 端口 | |
| --- | --- | --- | --- |
| `admin-web` | 【前端】管理后台 | HTTP 8080 | |
| `mobile-web` | 【前端】商城 H5 | HTTP 8000 | |
| `system-application` | 管理员 HTTP 服务 | HTTP 18083 | [接口文档](http://api.shop.iocoder.cn:18099/admin-api/doc.html) |
| `user-application` | 用户 HTTP 服务 | HTTP 18082 | [接口文档](http://api.shop.iocoder.cn:18099/user-api/doc.html) |
| `product-application` | 商品 HTTP 服务 | HTTP 18081 | [接口文档](http://api.shop.iocoder.cn:18099/product-api/doc.html) |
| `pay-application` | 支付 HTTP 服务 | HTTP 18084 | [接口文档](http://api.shop.iocoder.cn:18099/pay-api/doc.html) |
| `promotion-application` | 促销 HTTP 服务 | HTTP 18085 | [接口文档](http://api.shop.iocoder.cn:18099/promotion-api/doc.html) |
| `search-application` | 搜索 HTTP 服务 | HTTP 18086 | [接口文档](http://api.shop.iocoder.cn:18099/search-api/doc.html) |
| `order-application` | 订单 HTTP 服务 | HTTP 18088 | [接口文档](http://api.shop.iocoder.cn:18099/order-api/doc.html) |
-------
后端项目,目前的项目结构如下:
```Java
[-] xxx
[-] xxx-application // 提供对外 HTTP API 。
[-] xxx-service-api // 提供 Dubbo 服务 API 。
[-] xxx-service-impl // 提供 Dubbo 服务 Service 实现。
```
考虑到大多数公司,无需拆分的特别细,并且过多 JVM 带来的服务器成本。所以目前的设定是:
* `xxx-service-impl` 内嵌在 `xxx-application` 中运行。
* MQ 消费者、定时器执行器,内嵌在 `xxx-service-impl` 中运行。
也就是说,一个 `xxx-application` 启动后,该模块就完整启动了。
## 技术栈
### 后端
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.1.4 |
| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.6 |
| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.1.16 |
| [MyBatis](http://www.mybatis.org/mybatis-3/zh/index.html) | 数据持久层框架 | 3.5.1 |
| [MyBatis-Plus](https://mp.baomidou.com/) | Mybatis 增强工具包 | 3.1.1 |
| [Redis](https://redis.io/) | key-value 数据库 | 暂未引入,等压测后,部分模块 |
| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 暂未引入,等压测后,部分模块 |
| [Elasticsearch](https://www.elastic.co/cn/) | 分布式搜索引擎 | 6.7.1 |
| [Dubbo](http://dubbo.apache.org/) | 分布式 RPC 服务框架 | 2.7.1 |
| [RocketMQ](http://dubbo.apache.org/) | 消息中间件 | 4.3.2 |
| [Seata](https://github.com/seata/seata) | 分布式事务中间件 | 0.5.1 |
| [Zookeeper](http://zookeeper.apache.org/) | 分布式系统协调 | 3.4.9 作为注册中心 |
| [XXL-Job](http://www.xuxueli.com/xxl-job/) | 分布式任务调度平台 | 2.0.1 |
| [springfox-swagger2](https://github.com/springfox/springfox/tree/master/springfox-swagger2) | API 文档 | 2.9.2 |
| [swagger-bootstrap-ui](https://gitee.com/xiaoym/swagger-bootstrap-ui) | Swagger 增强 UI 实现 | 1.9.3 |
未来考虑引入
* [ ] 配置中心 Apollo
* [ ] 服务保障 Sentinel
* [ ] 网关 Soul
### 前端
商城 H5 和管理后台,分别采用了 Vue 和 React ,基于其适合的场景考虑。具体的,可以看看 [《为什么 React 比 Vue 更适合大型应用?》](https://www.zhihu.com/question/314761485/answer/615318460) 的讨论。
**商城 H5**
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [Vue](https://cn.vuejs.org/index.html) | JavaScript 框架 | 2.5.17 |
| [Vant](https://youzan.github.io/vant/#/zh-CN/intro) | Vue UI 组件库 | 3.13.0 |
**管理后台**
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [React](https://reactjs.org/) | JavaScript 框架 | 16.7.0 |
| [Ant Design](https://ant.design/docs/react/introduce-cn) | React UI 组件库 | 3.13.0 |
### 监控
一般来说,监控会有三种方式:
* 1、Tracing ,我们采用 Apache SkyWalking
* 2、Logging ,我们采用 ELK
* 3、Metrics ,我们采用 Prometheus
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [SkyWalking](http://skywalking.apache.org/) | 分布式应用追踪系统 | 6.0.0 |
| [Prometheus](https://prometheus.io/) | 服务监控体系 | 2.9.2 |
| [Alertmanager](https://prometheus.io/docs/alerting/alertmanager/) | 告警管理器 | 0.17.0 |
| [Grafana](https://grafana.com/) | 仪表盘和图形编辑器 | 0.17.0 |
### 其它
* Jenkins 持续集成
* Nginx 服务器
* [ ] Docker 容器
* [ ] Nginx
# 某种结尾
目前成员
* 小范
* 芋艿
目前已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。

View File

@@ -1,35 +0,0 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
**/node_modules
/src/utils/request-temp.js
# production
/.vscode
# misc
.DS_Store
npm-debug.log*
yarn-error.log
/coverage
.idea
yarn.lock
package-lock.json
*bak
.vscode
# visual studio code
.history
*.log
functions/mock
.temp/**
# umi
.umi
.umi-production
# screenshot
screenshot
.firebase

View File

@@ -1,16 +0,0 @@
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab

View File

@@ -1,3 +0,0 @@
/functions/mock/**
/scripts
/config

View File

@@ -1,39 +0,0 @@
module.exports = {
parser: 'babel-eslint',
extends: ['airbnb', 'prettier', 'plugin:compat/recommended'],
env: {
browser: true,
node: true,
es6: true,
mocha: true,
jest: true,
jasmine: true,
},
globals: {
APP_TYPE: true,
page: true,
},
rules: {
'react/jsx-filename-extension': [1, { extensions: ['.js'] }],
'react/jsx-wrap-multilines': 0,
'react/prop-types': 0,
'react/forbid-prop-types': 0,
'react/jsx-one-expression-per-line': 0,
'import/no-unresolved': [2, { ignore: ['^@/', '^umi/'] }],
'import/no-extraneous-dependencies': [
2,
{
optionalDependencies: true,
devDependencies: ['**/tests/**.js', '/mock/**/**.js', '**/**.test.js'],
},
],
'jsx-a11y/no-noninteractive-element-interactions': 0,
'jsx-a11y/click-events-have-key-events': 0,
'jsx-a11y/no-static-element-interactions': 0,
'jsx-a11y/anchor-is-valid': 0,
'linebreak-style': 0,
},
settings: {
polyfills: ['fetch', 'promises', 'url'],
},
};

View File

@@ -1,5 +0,0 @@
{
"projects": {
"default": "antd-pro"
}
}

38
admin-web/.gitignore vendored
View File

@@ -1,38 +0,0 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
**/node_modules
# roadhog-api-doc ignore
/src/utils/request-temp.js
_roadhog-api-doc
# production
/dist
/.vscode
# misc
.DS_Store
npm-debug.log*
yarn-error.log
/coverage
.idea
yarn.lock
package-lock.json
*bak
.vscode
# visual studio code
.history
*.log
functions/mock
.temp/**
# umi
.umi
.umi-production
# screenshot
screenshot
.firebase

View File

@@ -1,6 +0,0 @@
ports:
- port: 8000
onOpen: open-preview
tasks:
- init: npm install
command: npm start

View File

@@ -1,5 +0,0 @@
**/*.md
**/*.svg
package.json
.umi
.umi-production

View File

@@ -1,11 +0,0 @@
{
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 100,
"overrides": [
{
"files": ".prettierrc",
"options": { "parser": "json" }
}
]
}

View File

@@ -1,13 +0,0 @@
{
"extends": [
"stylelint-config-standard",
"stylelint-config-css-modules",
"stylelint-config-rational-order",
"stylelint-config-prettier"
],
"plugins": ["stylelint-order", "stylelint-declaration-block-no-ignored-properties"],
"rules": {
"no-descending-specificity": null,
"plugin/declaration-block-no-ignored-properties": true
}
}

View File

@@ -1,46 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at afc163@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@@ -1,12 +0,0 @@
FROM circleci/node:latest-browsers
WORKDIR /usr/src/app/
USER root
COPY package.json ./
RUN yarn
COPY ./ ./
RUN npm run test:all
CMD ["npm", "run", "build"]

View File

@@ -1,11 +0,0 @@
FROM node:latest
WORKDIR /usr/src/app/
COPY package.json ./
RUN npm install --silent --no-cache
COPY ./ ./
CMD ["npm", "run", "start"]

View File

@@ -1,11 +0,0 @@
FROM nginx
WORKDIR /usr/src/app/
COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY ./dist /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2019 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,38 +0,0 @@
# 后台管理页面
> 采用 antd pro 快速开发
> TODO
## 命名规范
#### 1.文件夹命名
文件夹命名全部小写,单词之间以中划线隔离 例如: node-modules
#### 2.文件命名
文件以小写开头,以驼峰格式连接单词 例如: dashBoard.js
component目录下的文件 以大写开头
route目录下的文件以大写开头
model目录下的文件大写开头
#### 3.标点符号
对于字符串统一用单引号 例如: 'hello world'
#### 4.语法规范
JS语法规范遵守ES6规范
http://www.tuicool.com/articles/YrQ7j2a
#### 5.注释
1.route目录下的文件需要加上文件头部注释写清楚文件是什么功能
2.component文件需要加上头部注释 (写清楚改控件的用处)
## 补充规范
1. services 目录中,每个 api 文件,对应后端一个 api 服务。主要考虑是

View File

@@ -1,74 +0,0 @@
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
name: ant design pro
trigger:
- master
jobs:
- job: lintAndBuild
pool:
vmImage: 'Ubuntu-16.04'
steps:
- checkout: self
clean: false
- script: yarn install
displayName: install
- script: npm run lint
displayName: lint
- script: npm run build
env:
PROGRESS: none
displayName: build
- job: test
pool:
vmImage: 'Ubuntu-16.04'
container:
image: circleci/node:latest-browsers
options: '-u root'
steps:
- script: yarn install
displayName: install
- script: npm run test:all
env:
PROGRESS: none
displayName: test
- job: Windows
pool:
vmImage: 'vs2017-win2016'
steps:
- task: NodeTool@0
inputs:
versionSpec: '11.x'
- script: yarn install
displayName: install
- script: npm run lint
displayName: lint
- script: npm run build
env:
PROGRESS: none
displayName: build
- job: MacOS
pool:
vmImage: 'macOS-10.13'
steps:
- task: NodeTool@0
inputs:
versionSpec: '11.x'
- script: yarn install
displayName: install
- script: npm run lint
displayName: lint
- script: npm run
env:
PROGRESS: none
displayName: build

View File

@@ -1,121 +0,0 @@
// https://umijs.org/config/
import os from 'os';
import pageRoutes from './router.config';
import webpackPlugin from './plugin.config';
import defaultSettings from '../src/defaultSettings';
import slash from 'slash2';
import proxy from './proxy';
const { pwa, primaryColor } = defaultSettings;
const { NODE_ENV, APP_TYPE, TEST, BASE_PATH } = process.env;
// 用于控制,部署非跟目录下
const basePath = BASE_PATH ? BASE_PATH : '';
const plugins = [
[
'umi-plugin-react',
{
antd: true,
dva: {
hmr: true,
},
locale: {
enable: true, // default false
default: 'zh-CN', // default zh-CN
baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default
},
dynamicImport: {
loadingComponent: './components/PageLoading/index',
webpackChunkName: true,
level: 3,
},
pwa: pwa
? {
workboxPluginMode: 'InjectManifest',
workboxOptions: {
importWorkboxFrom: 'local',
},
}
: {},
...(!TEST && os.platform() === 'darwin'
? {
dll: {
include: ['dva', 'dva/router', 'dva/saga', 'dva/fetch'],
exclude: ['@babel/runtime'],
},
hardSource: false,
}
: {}),
},
],
];
// 针对 preview.pro.ant.design 的 GA 统计代码
// 业务上不需要这个
if (APP_TYPE === 'site') {
plugins.push([
'umi-plugin-ga',
{
code: 'UA-72788897-6',
},
]);
}
export default {
// add for transfer to umi
base: basePath,
publicPath: basePath,
plugins,
define: {
APP_TYPE: APP_TYPE || '',
},
treeShaking: true,
targets: {
ie: 11,
},
// 路由配置
routes: pageRoutes,
// Theme for antd
// https://ant.design/docs/react/customize-theme-cn
theme: {
'primary-color': primaryColor,
},
externals: {
'@antv/data-set': 'DataSet',
bizcharts: 'BizCharts',
},
proxy: proxy(NODE_ENV, basePath),
ignoreMomentLocale: true,
lessLoaderOptions: {
javascriptEnabled: true,
},
disableRedirectHoist: true,
cssLoaderOptions: {
modules: true,
getLocalIdent: (context, localIdentName, localName) => {
if (
context.resourcePath.includes('node_modules') ||
context.resourcePath.includes('ant.design.pro.less') ||
context.resourcePath.includes('global.less')
) {
return localName;
}
const match = context.resourcePath.match(/src(.*)/);
if (match && match[1]) {
const antdProPath = match[1].replace('.less', '');
const arr = slash(antdProPath)
.split('/')
.map(a => a.replace(/([A-Z])/g, '-$1'))
.map(a => a.toLowerCase());
return `antd-pro${arr.join('-')}-${localName}`.replace(/--/g, '-');
}
return localName;
},
},
manifest: {
basePath: '/',
},
chainWebpack: webpackPlugin,
};

View File

@@ -1,33 +0,0 @@
// Change theme plugin
import MergeLessPlugin from 'antd-pro-merge-less';
import AntDesignThemePlugin from 'antd-theme-webpack-plugin';
import path from 'path';
export default config => {
// pro 和 开发环境再添加这个插件
if (process.env.APP_TYPE === 'site' || process.env.NODE_ENV !== 'production') {
// 将所有 less 合并为一个供 themePlugin使用
const outFile = path.join(__dirname, '../.temp/ant-design-pro.less');
const stylesDir = path.join(__dirname, '../src/');
config.plugin('merge-less').use(MergeLessPlugin, [
{
stylesDir,
outFile,
},
]);
config.plugin('ant-design-theme').use(AntDesignThemePlugin, [
{
antDir: path.join(__dirname, '../node_modules/antd'),
stylesDir,
varFile: path.join(__dirname, '../node_modules/antd/lib/style/themes/default.less'),
mainLessFile: outFile, // themeVariables: ['@primary-color'],
indexFileName: 'index.html',
generateOne: true,
lessUrl: 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js',
},
]);
}
};

View File

@@ -1,27 +0,0 @@
// development 和 production
import path from 'path';
import proxyDev from './proxy.dev';
import proxyProd from './proxy.prod';
function basePathBuilder(proxys, basePath) {
for (const key in proxys) {
const proxy = proxys[key];
const pathRewrite = proxy.pathRewrite;
const newPathRewrite = {};
for (const key2 in pathRewrite) {
const item = pathRewrite[key2];
newPathRewrite[key2] = path.join(basePath, item);
}
proxy.pathRewrite = newPathRewrite;
}
return proxys;
}
export default function(NODE_ENV, basePath) {
let proxys = NODE_ENV === 'development' || NODE_ENV === 'undefined' ? proxyDev : proxyProd;
if (basePath) {
proxys = basePathBuilder(proxys, basePath);
}
return proxys;
}

View File

@@ -1,40 +0,0 @@
// 开发环境,的代理配置
module.exports = {
'/admin-api/': {
target: 'http://127.0.0.1:18083/',
// target: 'http://180.167.213.26:18083/',
changeOrigin: true,
pathRewrite: {},
},
'/product-api/': {
// target: 'http://180.167.213.26:18083/',
target: 'http://127.0.0.1:18081/',
changeOrigin: true,
pathRewrite: {},
},
'/order-api/': {
// target: 'http://180.167.213.26:18084/',
target: 'http://127.0.0.1:18088/',
changeOrigin: true,
pathRewrite: {},
},
'/promotion-api/': {
// target: 'http://180.167.213.26:18085/',
target: 'http://127.0.0.1:18085/',
changeOrigin: true,
pathRewrite: {},
},
'/user-api/': {
// target: 'http://180.167.213.26:18085/',
target: 'http://127.0.0.1:18082/',
changeOrigin: true,
pathRewrite: {},
},
'/pay-api/': {
// target: 'http://180.167.213.26:18085/',
target: 'http://127.0.0.1:18084/',
changeOrigin: true,
pathRewrite: {},
},
};

View File

@@ -1,39 +0,0 @@
// production 配置文件
module.exports = {
'/admin-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/product-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/order-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/promotion-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/pay-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/user-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/server/api/': {
target: 'https://preview.pro.ant.design/',
changeOrigin: true,
pathRewrite: { '^/server': '' },
},
};

View File

@@ -1,456 +0,0 @@
export default [
// user
{
path: '/user',
component: '../layouts/UserLayout',
routes: [
{ path: '/user', redirect: '/user/login' },
{ path: '/user/login', name: 'login', component: './User/Login' },
{ path: '/user/register', name: 'register', component: './User/Register' },
{
path: '/user/register-result',
name: 'register.result',
component: './User/RegisterResult',
},
],
},
// app
{
path: '/',
component: '../layouts/BasicLayout',
Routes: ['src/pages/Authorized'],
authority: ['admin', 'user'],
routes: [
// redirect
{ path: '/', redirect: '/home' },
// home
{
path: '/home',
name: 'home',
icon: 'user',
component: './Home/Home',
},
// admin
{
path: '/admin',
name: 'admin',
icon: 'user',
routes: [
{
path: '/admin/admin-list',
name: 'admin-list',
component: './Admin/AdminList',
},
{
path: '/admin/resource-list',
name: 'resource-list',
component: './Admin/ResourceList',
},
{
path: '/admin/role-list',
name: 'role-list',
component: './Admin/RoleList',
},
{
path: '/admin/dept-list',
name: 'deptment-list',
component: './Admin/DeptmentList',
},
{
path: '/admin/dictionary-list',
name: 'dictionary-list',
component: './Admin/DictionaryList',
},
],
},
// user
{
path: '/member', // TODO 芋艿,后面调整
name: 'user',
icon: 'user',
routes: [
{
path: '/member/user-list',
name: 'user-list',
component: './User/UserList',
},
],
},
// order
{
path: 'order',
name: 'order',
icon: 'user',
routes: [
{
path: '/order/order-list',
name: 'order-list',
component: './Order/OrderList',
},
{
path: '/order/order-refunds',
name: 'order-refunds',
component: './OrderRefunds/OrderRefundsList',
},
],
},
// product
{
path: '/product',
name: 'product',
icon: 'user',
routes: [
{
path: '/product/product-spu-list',
name: 'product-spu-list',
component: './Product/ProductSpuList',
},
{
path: '/product/product-spu-add',
name: 'product-spu-add',
component: './Product/ProductSpuAddOrUpdate',
},
{
path: '/product/product-spu-update',
name: 'product-spu-update',
component: './Product/ProductSpuAddOrUpdate',
},
{
path: '/product/product-category-list',
name: 'product-category-list',
component: './Product/ProductCategoryList',
},
{
path: '/product/product-brand-list',
name: 'product-brand-list',
component: './Product/ProductBrandList',
},
{
path: '/product/product-attr-list',
name: 'product-attr-list',
component: './Product/ProductAttrList',
},
],
},
// promotion
{
path: '/promotion',
name: 'promotion',
icon: 'user',
routes: [
{
path: '/promotion/banner-list',
name: 'promotion-banner-list',
component: './Promotion/BannerList',
},
{
path: '/promotion/product-recommend-list',
name: 'product-recommend-list',
component: './Promotion/ProductRecommendList',
},
// {
// path: '/product/product-category-list',
// name: 'product-category-list',
// component: './Product/ProductCategoryList',
// },
{
path: '/promotion/coupon-card-template-list',
name: 'coupon-card-template-list',
component: './Promotion/CouponCardTemplateList',
},
{
path: '/promotion/time-limit-discount-list',
name: 'time-limit-discount-list',
component: './Promotion/TimeLimitedDiscountList',
},
{
path: '/promotion/full-privilege-list',
name: 'full-privilege-list',
component: './Promotion/FullPrivilegeList',
},
],
},
// pay
{
path: '/pay',
name: 'pay',
icon: 'user',
routes: [
{
path: '/pay/transaction-list',
name: 'pay-transaction-list',
component: './Pay/PayTransactionList',
},
{
path: '/pay/refund-list',
name: 'pay-refund-list',
component: './Pay/PayRefundList',
},
],
},
// sms
{
path: '/sms',
name: 'sms',
icon: 'user',
routes: [
{
path: '/sms/sign-list',
name: 'sign-list',
component: './Sms/SignList',
},
{
path: '/sms/template-list',
name: 'template-list',
component: './Sms/TemplateList',
},
],
},
{
path: '/dashboard',
name: 'dashboard',
icon: 'dashboard',
routes: [
{
path: '/dashboard/analysis',
name: 'analysis',
component: './Dashboard/Analysis',
},
{
path: '/dashboard/monitor',
name: 'monitor',
component: './Dashboard/Monitor',
},
{
path: '/dashboard/workplace',
name: 'workplace',
component: './Dashboard/Workplace',
},
],
},
// forms
{
path: '/form',
icon: 'form',
name: 'form',
routes: [
{
path: '/form/basic-form',
name: 'basicform',
component: './Forms/BasicForm',
},
{
path: '/form/step-form',
name: 'stepform',
component: './Forms/StepForm',
hideChildrenInMenu: true,
routes: [
{
path: '/form/step-form',
redirect: '/form/step-form/info',
},
{
path: '/form/step-form/info',
name: 'info',
component: './Forms/StepForm/Step1',
},
{
path: '/form/step-form/confirm',
name: 'confirm',
component: './Forms/StepForm/Step2',
},
{
path: '/form/step-form/result',
name: 'result',
component: './Forms/StepForm/Step3',
},
],
},
{
path: '/form/advanced-form',
name: 'advancedform',
authority: ['admin'],
component: './Forms/AdvancedForm',
},
],
},
// list
{
path: '/list',
icon: 'table',
name: 'list',
routes: [
{
path: '/list/table-list',
name: 'searchtable',
component: './List/TableList',
},
{
path: '/list/basic-list',
name: 'basiclist',
component: './List/BasicList',
},
{
path: '/list/card-list',
name: 'cardlist',
component: './List/CardList',
},
{
path: '/list/search',
name: 'searchlist',
component: './List/List',
routes: [
{
path: '/list/search',
redirect: '/list/search/articles',
},
{
path: '/list/search/articles',
name: 'articles',
component: './List/Articles',
},
{
path: '/list/search/projects',
name: 'projects',
component: './List/Projects',
},
{
path: '/list/search/applications',
name: 'applications',
component: './List/Applications',
},
],
},
],
},
{
path: '/profile',
name: 'profile',
icon: 'profile',
routes: [
// profile
{
path: '/profile/basic',
name: 'basic',
component: './Profile/BasicProfile',
},
{
path: '/profile/basic/:id',
name: 'basic',
hideInMenu: true,
component: './Profile/BasicProfile',
},
{
path: '/profile/advanced',
name: 'advanced',
authority: ['admin'],
component: './Profile/AdvancedProfile',
},
],
},
{
name: 'result',
icon: 'check-circle-o',
path: '/result',
routes: [
// result
{
path: '/result/success',
name: 'success',
component: './Result/Success',
},
{ path: '/result/fail', name: 'fail', component: './Result/Error' },
],
},
{
name: 'exception',
icon: 'warning',
path: '/exception',
routes: [
// exception
{
path: '/exception/403',
name: 'not-permission',
component: './Exception/403',
},
{
path: '/exception/404',
name: 'not-find',
component: './Exception/404',
},
{
path: '/exception/500',
name: 'server-error',
component: './Exception/500',
},
{
path: '/exception/trigger',
name: 'trigger',
hideInMenu: true,
component: './Exception/TriggerException',
},
],
},
{
name: 'account',
icon: 'user',
path: '/account',
routes: [
{
path: '/account/center',
name: 'center',
component: './Account/Center/Center',
routes: [
{
path: '/account/center',
redirect: '/account/center/articles',
},
{
path: '/account/center/articles',
component: './Account/Center/Articles',
},
{
path: '/account/center/applications',
component: './Account/Center/Applications',
},
{
path: '/account/center/projects',
component: './Account/Center/Projects',
},
],
},
{
path: '/account/settings',
name: 'settings',
component: './Account/Settings/Info',
routes: [
{
path: '/account/settings',
redirect: '/account/settings/base',
},
{
path: '/account/settings/base',
component: './Account/Settings/BaseView',
},
{
path: '/account/settings/security',
component: './Account/Settings/SecurityView',
},
{
path: '/account/settings/binding',
component: './Account/Settings/BindingView',
},
{
path: '/account/settings/notification',
component: './Account/Settings/NotificationView',
},
],
},
],
},
{
component: '404',
},
],
},
];

View File

@@ -1,25 +0,0 @@
# 使用说明
### 第一步
```
npm install
```
### 第二步
复制文件到 server 目录
```
cp -rf dist server
```
### 第三步
```
node server.prod
```

View File

@@ -1,12 +0,0 @@
//
// 粉笔:
// 输出不同颜色的提示信息
const chalk = require('chalk');
module.exports = {
chalkError: chalk.red,
chalkSuccess: chalk.green,
chalkWarning: chalk.yellow,
chalkProcessing: chalk.blue,
};

View File

@@ -1,39 +0,0 @@
// production 配置文件
module.exports = {
'/admin-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/product-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/order-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/promotion-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/pay-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/user-api/': {
target: 'http://api.shop.iocoder.cn',
changeOrigin: true,
pathRewrite: {},
},
'/server/api/': {
target: 'https://preview.pro.ant.design/',
changeOrigin: true,
pathRewrite: { '^/server': '' },
},
};

View File

@@ -1,10 +0,0 @@
{
"name": "browser-work-server",
"description": "node server",
"dependencies": {
"express": "^4.16.3",
"object-assign": "4.1.1",
"chalk": "2.4.1",
"http-proxy-middleware": "^0.18.0"
}
}

View File

@@ -1,11 +0,0 @@
{
"name": "admin-web",
"script": "./server.prod.js",
"instances": "1",
"env": {
"NODE_ENV": "development"
},
"env_production": {
"NODE_ENV": "production"
}
}

View File

@@ -1,35 +0,0 @@
const path = require('path');
const express = require('express');
const { chalkSuccess } = require('./config/chalk.config');
const proxyConfig = require('./config/proxy.prod.config');
const proxyBuild = require('./utils/proxy.build');
// create app server
const app = express();
const port = 3000;
// host proxy
app.use(proxyBuild(proxyConfig));
// use index.html
app.use(express.static(path.join(__dirname, 'dist/static')));
app.use(express.static(path.join(__dirname, 'dist')));
app.use((req, res) => {
res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});
app.listen(port, error => {
if (error) {
console.error(error);
} else {
console.info(
chalkSuccess(
'==> 🌎 Listening on port %s. ' + 'Open up http://localhost:%s/ in your browser.'
),
port,
port
);
}
});

View File

@@ -1,46 +0,0 @@
# 安装依赖包
cd admin-web
cnpm install
# 开始构建
#npm run build
# 创建 app 运行目录
rm -rf app
mkdir app
# 复制配置文件
cp -rf config/server app/
# npm 构建项目
npm run build
# 复制文件到 server 努力
cp -rf dist app/server
# 复制文件到 project 目录执行
if [ ! -d "/work2/project/admin-web/server/dist" ]; then
mkdir -pv /work2/project/admin-web/server/dist
else
rm -rf /work2/project/admin-web/server/dist
fi
cp -rf app/server /work2/project/admin-web
# 安装 server 依赖项
cd /work2/project/admin-web/server
npm install
# 启动服务
pm2 restart pm2.json

View File

@@ -1,50 +0,0 @@
const proxy = require('http-proxy-middleware');
const ObjectAssign = require('object-assign');
const { chalkError, chalkSuccess } = require('../config/chalk.config');
/**
*
* key :
* [0]: /api
* [1]: target url
*
* 预计写法:
* 1、 /api -> baidu.com : { }
* 2、 /user : function() { return {} }
*
* @param config
*/
module.exports = function(config) {
console.info(chalkSuccess('build proxy.%s.config 配置!'), process.env.NODE_ENV);
const proxys = [];
if (!config) {
console.log(chalkError('proxy.%s.config 没有配置!'), process.env.NODE_ENV);
}
for (const key in config) {
let source;
let target;
if (/->/.test(key)) {
const keys = key.toString().split('->');
source = keys[0].trim();
target = keys[1].trim();
} else {
source = key;
target = config[key].target;
}
if (typeof config !== 'object') {
console.log(
chalkError('%s: proxy.%s.config 初始化失败 config 类型为 object!'),
key,
process.env.NODE_ENV
);
break;
}
proxys.push(proxy(source, ObjectAssign({ target }, config[key])));
}
return proxys;
};

View File

@@ -1,14 +0,0 @@
version: "3.5"
services:
ant-design-pro_dev:
ports:
- 8000:8000
build:
context: ../
dockerfile: Dockerfile.dev
container_name: "ant-design-pro_dev"
volumes:
- ../src:/usr/src/app/src
- ../config:/usr/src/app/config
- ../mock:/usr/src/app/mock

View File

@@ -1,21 +0,0 @@
version: "3.5"
services:
ant-design-pro_build:
build: ../
container_name: "ant-design-pro_build"
volumes:
- dist:/usr/src/app/dist
ant-design-pro_web:
image: nginx
ports:
- 80:80
container_name: "ant-design-pro_web"
restart: unless-stopped
volumes:
- dist:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf
volumes:
dist:

View File

@@ -1,22 +0,0 @@
server {
listen 80;
# gzip config
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass https://preview.pro.ant.design;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
}

View File

@@ -1,13 +0,0 @@
{
"hosting": {
"public": "dist",
"rewrites": [
{ "source": "/api/**", "function": "api" },
{
"source": "**",
"destination": "/index.html"
}
],
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
}
}

View File

@@ -1,10 +0,0 @@
// [START functionsimport]
const functions = require('firebase-functions');
const express = require('express');
const matchMock = require('./matchMock');
const app = express();
app.use(matchMock);
exports.api = functions.https.onRequest(app);

View File

@@ -1,115 +0,0 @@
const pathToRegexp = require('path-to-regexp');
const bodyParser = require('body-parser');
const mockFile = require('./mock/index');
const BODY_PARSED_METHODS = ['post', 'put', 'patch'];
const debug = console.log;
function parseKey(key) {
let method = 'get';
let path = key;
if (key.indexOf(' ') > -1) {
const splited = key.split(' ');
method = splited[0].toLowerCase();
path = splited[1]; // eslint-disable-line
}
return {
method,
path,
};
}
function createHandler(method, path, handler) {
return (req, res, next) => {
function sendData() {
if (typeof handler === 'function') {
handler(req, res, next);
} else {
res.json(handler);
}
}
if (BODY_PARSED_METHODS.includes(method)) {
bodyParser.json({ limit: '5mb', strict: false })(req, res, () => {
bodyParser.urlencoded({ limit: '5mb', extended: true })(req, res, () => {
sendData();
});
});
} else {
sendData();
}
};
}
function normalizeConfig(config) {
return Object.keys(config).reduce((memo, key) => {
const handler = config[key];
const { method, path } = parseKey(key);
const keys = [];
const re = pathToRegexp(path, keys);
memo.push({
method,
path,
re,
keys,
handler: createHandler(method, path, handler),
});
return memo;
}, []);
}
const mockData = normalizeConfig(mockFile);
function matchMock(req) {
const { path: exceptPath } = req;
const exceptMethod = req.method.toLowerCase();
function decodeParam(val) {
if (typeof val !== 'string' || val.length === 0) {
return val;
}
try {
return decodeURIComponent(val);
} catch (err) {
if (err instanceof URIError) {
err.message = `Failed to decode param ' ${val} '`;
err.statusCode = 400;
err.status = 400;
}
throw err;
}
}
// eslint-disable-next-line no-restricted-syntax
for (const mock of mockData) {
const { method, re, keys } = mock;
if (method === exceptMethod) {
const match = re.exec(req.path);
if (match) {
const params = {};
for (let i = 1; i < match.length; i += 1) {
const key = keys[i - 1];
const prop = key.name;
const val = decodeParam(match[i]);
if (val !== undefined || !hasOwnProperty.call(params, prop)) {
params[prop] = val;
}
}
req.params = params;
return mock;
}
}
}
return mockData.filter(({ method, re }) => method === exceptMethod && re.test(exceptPath))[0];
}
module.exports = (req, res, next) => {
const match = matchMock(req);
if (match) {
debug(`mock matched: [${match.method}] ${match.path}`);
return match.handler(req, res, next);
}
return next();
};

View File

@@ -1,23 +0,0 @@
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "npm run mock && firebase deploy --only functions",
"logs": "firebase functions:log",
"mock": "node ../scripts/generateMock.js"
},
"dependencies": {
"@babel/runtime": "^7.0.0",
"body-parser": "^1.18.3",
"express": "^4.16.4",
"firebase-admin": "^6.4.0",
"firebase-functions": "^2.1.0",
"mockjs": "^1.0.1-beta3",
"moment": "^2.22.2",
"path-to-regexp": "^3.0.0"
},
"private": true
}

View File

@@ -1,57 +0,0 @@
const DEFAULT_PAGE_NO = 1;
const DEFAULT_PAGE_SIZE = 10;
class PaginationHelper {
static defaultPaginationConfig = {
defaultCurrent: DEFAULT_PAGE_NO,
defaultPageSize: DEFAULT_PAGE_SIZE,
current: DEFAULT_PAGE_NO,
total: 0,
pageSize: DEFAULT_PAGE_SIZE,
showSizeChanger: true,
showQuickJumper: true,
showTotal: total => ` ${total} `
};
static formatPagination(data) {
return {
defaultCurrent: DEFAULT_PAGE_NO,
defaultPageSize: DEFAULT_PAGE_SIZE,
current: data.current,
total: data.total,
pageSize: data.size,
showSizeChanger: true,
showQuickJumper: true,
showTotal: total => ` ${total} `,
};
};
/**
* data.total 数据总数
* payload.pageNo 页码
* payload.pageSize 每页总数
*/
static formatPagination(data, payload) {
return {
defaultCurrent: DEFAULT_PAGE_NO,
defaultPageSize: DEFAULT_PAGE_SIZE,
current: payload.pageNo,
pageSize: payload.pageSize,
total: data.total,
showSizeChanger: true,
showQuickJumper: true,
showTotal: total => ` ${total} `,
};
};
//获取初始页码
static defaultPayload = {
pageNo: DEFAULT_PAGE_NO,
pageSize: DEFAULT_PAGE_SIZE
}
}
export default PaginationHelper;
export {PaginationHelper};

View File

@@ -1,10 +0,0 @@
// 校验必须是英文或者数字
export function checkTypeWithEnglishAndNumbers (rule, value, callback, text) {
let char = /^[a-zA-Z0-9]+$/
if (char.test(value)) {
callback()
} else {
callback(text)
}
}

View File

@@ -1,11 +0,0 @@
// ps https://github.com/GoogleChrome/puppeteer/issues/3120
module.exports = {
launch: {
args: [
'--disable-gpu',
'--disable-dev-shm-usage',
'--no-first-run',
'--no-zygote',
],
},
};

View File

@@ -1,4 +0,0 @@
module.exports = {
testURL: 'http://localhost:8000',
preset: 'jest-puppeteer',
};

View File

@@ -1,10 +0,0 @@
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

View File

@@ -1,58 +0,0 @@
/* eslint-disable */
import mockjs from 'mockjs';
import { resultBody } from './mock-comment';
import adminMenu from './geographic/admin-menu.json';
import adminMenuAll from './geographic/admin-menu-all.json';
import adminUrls from './geographic/admin-urls';
import resourceTree from './geographic/resource-tree.json';
import roleQuery from './geographic/role-query.json';
import dictionaryList from './geographic/dictionary-list.json';
function getAdminMenu(req, res) {
return res.json(adminMenu);
}
function getAdminMenuAll(req, res) {
return res.json(adminMenuAll);
}
function getAdminUrls(req, res) {
return res.json(adminUrls);
}
function getResourceTree(req, res) {
return res.json(resourceTree);
}
function getQueryRole(req, res) {
return res.json(roleQuery);
}
function getDictionaryKeys(req, res) {
const values = mockjs.mock({
'list|5': [{ 'value|+1': 0, text: '@city' }],
});
return res.json(resultBody(values));
}
function getDictionaryText(req, res) {
const values = mockjs.mock({
text: '@city',
});
return res.json(resultBody(values));
}
function getDictionaryTree(req, res) {
return res.json(dictionaryList);
}
export default {
// 'GET /admin-api/admins/admin/menu_resource_tree': getAdminMenuAll,
// 'GET /admin-api/admins/admin/url_resource_list': getAdminUrls,
// 'GET /admin-api/admins/resource/tree': getResourceTree,
// 'GET /admin-api/admins/role/page': getQueryRole,
// 'GET /admin-api/admins/admin/page': getQueryRole,
// 'GET /admin-api/admins/data_dict/tree': getDictionaryTree,
};

View File

@@ -1,336 +0,0 @@
import mockjs from 'mockjs';
const titles = [
'Alipay',
'Angular',
'Ant Design',
'Ant Design Pro',
'Bootstrap',
'React',
'Vue',
'Webpack',
];
const avatars = [
'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay
'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular
'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design
'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro
'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap
'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React
'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue
'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', // Webpack
];
const avatars2 = [
'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png',
'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png',
'https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png',
'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png',
'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png',
'https://gw.alipayobjects.com/zos/rmsportal/psOgztMplJMGpVEqfcgF.png',
'https://gw.alipayobjects.com/zos/rmsportal/ZpBqSxLxVEXfcUNoPKrz.png',
'https://gw.alipayobjects.com/zos/rmsportal/laiEnJdGHVOhJrUShBaJ.png',
'https://gw.alipayobjects.com/zos/rmsportal/UrQsqscbKEpNuJcvBZBu.png',
];
const covers = [
'https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png',
'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png',
'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png',
'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png',
];
const desc = [
'那是一种内在的东西 他们到达不了也无法触及的',
'希望是一个好东西也许是最好的好东西是不会消亡的',
'生命就像一盒巧克力结果往往出人意料',
'城镇中有那么多的酒馆她却偏偏走进了我的酒馆',
'那时候我只会想自己想要什么从不想自己拥有什么',
];
const user = [
'付小小',
'曲丽丽',
'林东东',
'周星星',
'吴加好',
'朱偏右',
'鱼酱',
'乐哥',
'谭小仪',
'仲尼',
];
function fakeList(count) {
const list = [];
for (let i = 0; i < count; i += 1) {
list.push({
id: `fake-list-${i}`,
owner: user[i % 10],
title: titles[i % 8],
avatar: avatars[i % 8],
cover: parseInt(i / 4, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)],
status: ['active', 'exception', 'normal'][i % 3],
percent: Math.ceil(Math.random() * 50) + 50,
logo: avatars[i % 8],
href: 'https://ant.design',
updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i),
createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i),
subDescription: desc[i % 5],
description:
'在中台产品的研发过程中会出现不同的设计规范和实现方式但其中往往存在很多类似的页面和组件这些类似的组件会被抽离成一套标准规范',
activeUser: Math.ceil(Math.random() * 100000) + 100000,
newUser: Math.ceil(Math.random() * 1000) + 1000,
star: Math.ceil(Math.random() * 100) + 100,
like: Math.ceil(Math.random() * 100) + 100,
message: Math.ceil(Math.random() * 10) + 10,
content:
'段落示意蚂蚁金服设计平台 ant.design用最小的工作量无缝接入蚂蚁金服生态提供跨越设计与开发的体验解决方案蚂蚁金服设计平台 ant.design用最小的工作量无缝接入蚂蚁金服生态提供跨越设计与开发的体验解决方案',
members: [
{
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png',
name: '曲丽丽',
id: 'member1',
},
{
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png',
name: '王昭君',
id: 'member2',
},
{
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png',
name: '董娜娜',
id: 'member3',
},
],
});
}
return list;
}
let sourceData;
function getFakeList(req, res) {
const params = req.query;
const count = params.count * 1 || 20;
const result = fakeList(count);
sourceData = result;
return res.json(result);
}
function postFakeList(req, res) {
const { /* url = '', */ body } = req;
// const params = getUrlParams(url);
const { method, id } = body;
// const count = (params.count * 1) || 20;
let result = sourceData;
switch (method) {
case 'delete':
result = result.filter(item => item.id !== id);
break;
case 'update':
result.forEach((item, i) => {
if (item.id === id) {
result[i] = Object.assign(item, body);
}
});
break;
case 'post':
result.unshift({
body,
id: `fake-list-${result.length}`,
createdAt: new Date().getTime(),
});
break;
default:
break;
}
return res.json(result);
}
const getNotice = [
{
id: 'xxx1',
title: titles[0],
logo: avatars[0],
description: '那是一种内在的东西他们到达不了也无法触及的',
updatedAt: new Date(),
member: '科学搬砖组',
href: '',
memberLink: '',
},
{
id: 'xxx2',
title: titles[1],
logo: avatars[1],
description: '希望是一个好东西也许是最好的好东西是不会消亡的',
updatedAt: new Date('2017-07-24'),
member: '全组都是吴彦祖',
href: '',
memberLink: '',
},
{
id: 'xxx3',
title: titles[2],
logo: avatars[2],
description: '城镇中有那么多的酒馆她却偏偏走进了我的酒馆',
updatedAt: new Date(),
member: '中二少女团',
href: '',
memberLink: '',
},
{
id: 'xxx4',
title: titles[3],
logo: avatars[3],
description: '那时候我只会想自己想要什么从不想自己拥有什么',
updatedAt: new Date('2017-07-23'),
member: '程序员日常',
href: '',
memberLink: '',
},
{
id: 'xxx5',
title: titles[4],
logo: avatars[4],
description: '凛冬将至',
updatedAt: new Date('2017-07-23'),
member: '高逼格设计天团',
href: '',
memberLink: '',
},
{
id: 'xxx6',
title: titles[5],
logo: avatars[5],
description: '生命就像一盒巧克力结果往往出人意料',
updatedAt: new Date('2017-07-23'),
member: '骗你来学计算机',
href: '',
memberLink: '',
},
];
const getActivities = [
{
id: 'trend-1',
updatedAt: new Date(),
user: {
name: '曲丽丽',
avatar: avatars2[0],
},
group: {
name: '高逼格设计天团',
link: 'http://github.com/',
},
project: {
name: '六月迭代',
link: 'http://github.com/',
},
template: ' @{group} 新建项目 @{project}',
},
{
id: 'trend-2',
updatedAt: new Date(),
user: {
name: '付小小',
avatar: avatars2[1],
},
group: {
name: '高逼格设计天团',
link: 'http://github.com/',
},
project: {
name: '六月迭代',
link: 'http://github.com/',
},
template: ' @{group} 新建项目 @{project}',
},
{
id: 'trend-3',
updatedAt: new Date(),
user: {
name: '林东东',
avatar: avatars2[2],
},
group: {
name: '中二少女团',
link: 'http://github.com/',
},
project: {
name: '六月迭代',
link: 'http://github.com/',
},
template: ' @{group} 新建项目 @{project}',
},
{
id: 'trend-4',
updatedAt: new Date(),
user: {
name: '周星星',
avatar: avatars2[4],
},
project: {
name: '5 月日常迭代',
link: 'http://github.com/',
},
template: ' @{project} 更新至已发布状态',
},
{
id: 'trend-5',
updatedAt: new Date(),
user: {
name: '朱偏右',
avatar: avatars2[3],
},
project: {
name: '工程效能',
link: 'http://github.com/',
},
comment: {
name: '留言',
link: 'http://github.com/',
},
template: ' @{project} 发布了 @{comment}',
},
{
id: 'trend-6',
updatedAt: new Date(),
user: {
name: '乐哥',
avatar: avatars2[5],
},
group: {
name: '程序员日常',
link: 'http://github.com/',
},
project: {
name: '品牌迭代',
link: 'http://github.com/',
},
template: ' @{group} 新建项目 @{project}',
},
];
function getFakeCaptcha(req, res) {
return res.json('captcha-xxx');
}
export default {
'GET /api/project/notice': getNotice,
'GET /api/activities': getActivities,
'POST /api/forms': (req, res) => {
res.send({ message: 'Ok' });
},
'GET /api/tags': mockjs.mock({
'list|100': [{ name: '@city', 'value|1-100': 150, 'type|0-2': 1 }],
}),
'GET /api/fake_list': getFakeList,
'POST /api/fake_list': postFakeList,
'GET /api/captcha': getFakeCaptcha,
};

View File

@@ -1,196 +0,0 @@
import moment from 'moment';
// mock data
const visitData = [];
const beginDay = new Date().getTime();
const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5];
for (let i = 0; i < fakeY.length; i += 1) {
visitData.push({
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
y: fakeY[i],
});
}
const visitData2 = [];
const fakeY2 = [1, 6, 4, 8, 3, 7, 2];
for (let i = 0; i < fakeY2.length; i += 1) {
visitData2.push({
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
y: fakeY2[i],
});
}
const salesData = [];
for (let i = 0; i < 12; i += 1) {
salesData.push({
x: `${i + 1}`,
y: Math.floor(Math.random() * 1000) + 200,
});
}
const searchData = [];
for (let i = 0; i < 50; i += 1) {
searchData.push({
index: i + 1,
keyword: `搜索关键词-${i}`,
count: Math.floor(Math.random() * 1000),
range: Math.floor(Math.random() * 100),
status: Math.floor((Math.random() * 10) % 2),
});
}
const salesTypeData = [
{
x: '家用电器',
y: 4544,
},
{
x: '食用酒水',
y: 3321,
},
{
x: '个护健康',
y: 3113,
},
{
x: '服饰箱包',
y: 2341,
},
{
x: '母婴产品',
y: 1231,
},
{
x: '其他',
y: 1231,
},
];
const salesTypeDataOnline = [
{
x: '家用电器',
y: 244,
},
{
x: '食用酒水',
y: 321,
},
{
x: '个护健康',
y: 311,
},
{
x: '服饰箱包',
y: 41,
},
{
x: '母婴产品',
y: 121,
},
{
x: '其他',
y: 111,
},
];
const salesTypeDataOffline = [
{
x: '家用电器',
y: 99,
},
{
x: '食用酒水',
y: 188,
},
{
x: '个护健康',
y: 344,
},
{
x: '服饰箱包',
y: 255,
},
{
x: '其他',
y: 65,
},
];
const offlineData = [];
for (let i = 0; i < 10; i += 1) {
offlineData.push({
name: `Stores ${i}`,
cvr: Math.ceil(Math.random() * 9) / 10,
});
}
const offlineChartData = [];
for (let i = 0; i < 20; i += 1) {
offlineChartData.push({
x: new Date().getTime() + 1000 * 60 * 30 * i,
y1: Math.floor(Math.random() * 100) + 10,
y2: Math.floor(Math.random() * 100) + 10,
});
}
const radarOriginData = [
{
name: '个人',
ref: 10,
koubei: 8,
output: 4,
contribute: 5,
hot: 7,
},
{
name: '团队',
ref: 3,
koubei: 9,
output: 6,
contribute: 3,
hot: 1,
},
{
name: '部门',
ref: 4,
koubei: 1,
output: 6,
contribute: 5,
hot: 7,
},
];
const radarData = [];
const radarTitleMap = {
ref: '引用',
koubei: '口碑',
output: '产量',
contribute: '贡献',
hot: '热度',
};
radarOriginData.forEach(item => {
Object.keys(item).forEach(key => {
if (key !== 'name') {
radarData.push({
name: item.name,
label: radarTitleMap[key],
value: item[key],
});
}
});
});
const getFakeChartData = {
visitData,
visitData2,
salesData,
searchData,
offlineData,
offlineChartData,
salesTypeData,
salesTypeDataOnline,
salesTypeDataOffline,
radarData,
};
export default {
'GET /api/fake_chart_data': getFakeChartData,
};

View File

@@ -1,15 +0,0 @@
import city from './geographic/city.json';
import province from './geographic/province.json';
function getProvince(req, res) {
return res.json(province);
}
function getCity(req, res) {
return res.json(city[req.params.province]);
}
export default {
'GET /api/geographic/province': getProvince,
'GET /api/geographic/city/:province': getCity,
};

View File

@@ -1,5 +0,0 @@
{
"code": 0,
"message": "",
"data": "all"
}

View File

@@ -1,72 +0,0 @@
{
"code": 0,
"message": "",
"data": [
{
"id": 20,
"handler": null,
"pid": 0,
"sort": 0,
"displayName": "商品管理",
"children": [
{
"id": 21,
"handler": "/product/product-spu-list",
"pid": 20,
"sort": 1,
"displayName": "商品管理",
"children": null
},
{
"id": 22,
"handler": "/product/product-category-list",
"pid": 20,
"sort": 2,
"displayName": "商品分类",
"children": null
}
]
},
{
"id": 13,
"handler": null,
"pid": 0,
"sort": 2,
"displayName": "系统管理",
"children": [
{
"id": 14,
"handler": "/admin/admin-list",
"pid": 13,
"sort": 0,
"displayName": "管理员列表",
"children": null
},
{
"id": 16,
"handler": "/admin/role-list",
"pid": 13,
"sort": 1,
"displayName": "角色列表",
"children": null
},
{
"id": 15,
"handler": "/admin/resource-list",
"pid": 13,
"sort": 2,
"displayName": "资源列表",
"children": null
},
{
"id": 19,
"handler": "/admin/dictionary-list",
"pid": 13,
"sort": 4,
"displayName": "数据字典",
"children": null
}
]
}
]
}

View File

@@ -1,5 +0,0 @@
{
"code": 0,
"data": ["/admin/source/add", "/admin/source/delete"],
"message": "string"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +0,0 @@
{
"code": 0,
"message": "",
"data": [
{
"enumValue": "gender",
"values": [
{
"value": "1",
"displayName": "男"
},
{
"value": "2",
"displayName": "女"
}
]
},
{
"enumValue": "gender",
"values": [
{
"value": "1",
"displayName": "男"
},
{
"value": "2",
"displayName": "女"
}
]
}
]
}

View File

@@ -1,19 +0,0 @@
{
"code": 0,
"message": "",
"data": [
{
"enumValue": "gender",
"values": [
{
"displayName": "男",
"value": 1
},
{
"displayName": "女",
"value": 2
}
]
}
]
}

View File

@@ -1,138 +0,0 @@
[
{
"name": "北京市",
"id": "110000"
},
{
"name": "天津市",
"id": "120000"
},
{
"name": "河北省",
"id": "130000"
},
{
"name": "山西省",
"id": "140000"
},
{
"name": "内蒙古自治区",
"id": "150000"
},
{
"name": "辽宁省",
"id": "210000"
},
{
"name": "吉林省",
"id": "220000"
},
{
"name": "黑龙江省",
"id": "230000"
},
{
"name": "上海市",
"id": "310000"
},
{
"name": "江苏省",
"id": "320000"
},
{
"name": "浙江省",
"id": "330000"
},
{
"name": "安徽省",
"id": "340000"
},
{
"name": "福建省",
"id": "350000"
},
{
"name": "江西省",
"id": "360000"
},
{
"name": "山东省",
"id": "370000"
},
{
"name": "河南省",
"id": "410000"
},
{
"name": "湖北省",
"id": "420000"
},
{
"name": "湖南省",
"id": "430000"
},
{
"name": "广东省",
"id": "440000"
},
{
"name": "广西壮族自治区",
"id": "450000"
},
{
"name": "海南省",
"id": "460000"
},
{
"name": "重庆市",
"id": "500000"
},
{
"name": "四川省",
"id": "510000"
},
{
"name": "贵州省",
"id": "520000"
},
{
"name": "云南省",
"id": "530000"
},
{
"name": "西藏自治区",
"id": "540000"
},
{
"name": "陕西省",
"id": "610000"
},
{
"name": "甘肃省",
"id": "620000"
},
{
"name": "青海省",
"id": "630000"
},
{
"name": "宁夏回族自治区",
"id": "640000"
},
{
"name": "新疆维吾尔自治区",
"id": "650000"
},
{
"name": "台湾省",
"id": "710000"
},
{
"name": "香港特别行政区",
"id": "810000"
},
{
"name": "澳门特别行政区",
"id": "820000"
}
]

View File

@@ -1,63 +0,0 @@
{
"code": 0,
"message": "",
"data": [
{
"id": 1,
"name": "admin_info",
"type": 2,
"sort": -1,
"displayName": "管理员信息(The mock data)",
"createTime": 1551020863000,
"pid": 0,
"handler": "/admin/admin/info",
"children": null
},
{
"id": 2,
"name": "product",
"type": 1,
"sort": 1,
"displayName": "商品",
"createTime": 1551062423000,
"pid": 0,
"handler": "",
"children": [
{
"id": 3,
"name": "product_manager",
"type": 1,
"sort": 1,
"displayName": "商品管理",
"createTime": 1551332076000,
"pid": 2,
"handler": "/product/list",
"children": null
}
]
},
{
"id": 9,
"name": "测试菜单1",
"type": 1,
"sort": 1,
"displayName": "测试说明",
"createTime": 1551371637000,
"pid": 0,
"handler": null,
"children": [
{
"id": 11,
"name": "测试",
"type": 1,
"sort": 1,
"displayName": "测试",
"createTime": 1551791053000,
"pid": 9,
"handler": "/admin/test",
"children": null
}
]
}
]
}

View File

@@ -1,19 +0,0 @@
{
"code": 0,
"data": {
"count": 2,
"roles": [
{
"id": 1,
"name": "系统管理员",
"createTime": 1551332076000
},
{
"id": 2,
"name": "系统管理员",
"createTime": 1551332076000
}
]
},
"message": "string"
}

View File

@@ -1,13 +0,0 @@
// 常用,公共 mock
export function resultBody(result, code, message) {
return {
code: code || 0,
message: message || '',
...(result || null),
};
}
export default {
resultBody,
};

View File

@@ -1,115 +0,0 @@
const fakeNotices = [
{
id: '000000001',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '你收到了 14 份新周报',
datetime: '2017-08-09',
type: 'notification',
},
{
id: '000000002',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
title: '你推荐的 曲妮妮 已通过第三轮面试',
datetime: '2017-08-08',
type: 'notification',
},
{
id: '000000003',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
title: '这种模板可以区分多种通知类型',
datetime: '2017-08-07',
read: true,
type: 'notification',
},
{
id: '000000004',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
datetime: '2017-08-07',
type: 'notification',
},
{
id: '000000005',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '内容不要超过两行字超出时自动截断',
datetime: '2017-08-07',
type: 'notification',
},
{
id: '000000006',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '曲丽丽 评论了你',
description: '描述信息描述信息描述信息',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000007',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '朱偏右 回复了你',
description: '这种模板用于提醒谁与你发生了互动左侧放的头像',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000008',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '标题',
description: '这种模板用于提醒谁与你发生了互动左侧放的头像',
datetime: '2017-08-07',
type: 'message',
clickClose: true,
},
{
id: '000000009',
title: '任务名称',
description: '任务需要在 2017-01-12 20:00 前启动',
extra: '未开始',
status: 'todo',
type: 'event',
},
{
id: '000000010',
title: '第三方紧急代码变更',
description: '冠霖提交于 2017-01-06需在 2017-01-07 前完成代码变更任务',
extra: '马上到期',
status: 'urgent',
type: 'event',
},
{
id: '000000011',
title: '信息安全考试',
description: '指派竹尔于 2017-01-09 前完成更新并发布',
extra: '已耗时 8 ',
status: 'doing',
type: 'event',
},
{
id: '000000012',
title: 'ABCD 版本发布',
description: '冠霖提交于 2017-01-06需在 2017-01-07 前完成代码变更任务',
extra: '进行中',
status: 'processing',
type: 'event',
},
];
const getNotices = (req, res) => {
if (req.query && req.query.type) {
const startFrom = parseInt(req.query.lastItemId, 10) + 1;
const result = fakeNotices
.filter(({ type }) => type === req.query.type)
.map((notice, index) => ({
...notice,
id: `0000000${startFrom + index}`,
}));
return res.json(startFrom > 24 ? result.concat(null) : result);
}
return res.json(fakeNotices);
};
export default {
'GET /api/notices': getNotices,
};

View File

@@ -1,177 +0,0 @@
import mockjs from 'mockjs';
const basicGoods = [
{
id: '1234561',
name: '矿泉水 550ml',
barcode: '12421432143214321',
price: '2.00',
num: '1',
amount: '2.00',
},
{
id: '1234562',
name: '凉茶 300ml',
barcode: '12421432143214322',
price: '3.00',
num: '2',
amount: '6.00',
},
{
id: '1234563',
name: '好吃的薯片',
barcode: '12421432143214323',
price: '7.00',
num: '4',
amount: '28.00',
},
{
id: '1234564',
name: '特别好吃的蛋卷',
barcode: '12421432143214324',
price: '8.50',
num: '3',
amount: '25.50',
},
];
const basicProgress = [
{
key: '1',
time: '2017-10-01 14:10',
rate: '联系客户',
status: 'processing',
operator: '取货员 ID1234',
cost: '5mins',
},
{
key: '2',
time: '2017-10-01 14:05',
rate: '取货员出发',
status: 'success',
operator: '取货员 ID1234',
cost: '1h',
},
{
key: '3',
time: '2017-10-01 13:05',
rate: '取货员接单',
status: 'success',
operator: '取货员 ID1234',
cost: '5mins',
},
{
key: '4',
time: '2017-10-01 13:00',
rate: '申请审批通过',
status: 'success',
operator: '系统',
cost: '1h',
},
{
key: '5',
time: '2017-10-01 12:00',
rate: '发起退货申请',
status: 'success',
operator: '用户',
cost: '5mins',
},
];
const advancedOperation1 = [
{
key: 'op1',
type: '订购关系生效',
name: '曲丽丽',
status: 'agree',
updatedAt: '2017-10-03 19:23:12',
memo: '-',
},
{
key: 'op2',
type: '财务复审',
name: '付小小',
status: 'reject',
updatedAt: '2017-10-03 19:23:12',
memo: '不通过原因',
},
{
key: 'op3',
type: '部门初审',
name: '周毛毛',
status: 'agree',
updatedAt: '2017-10-03 19:23:12',
memo: '-',
},
{
key: 'op4',
type: '提交订单',
name: '林东东',
status: 'agree',
updatedAt: '2017-10-03 19:23:12',
memo: '很棒',
},
{
key: 'op5',
type: '创建订单',
name: '汗牙牙',
status: 'agree',
updatedAt: '2017-10-03 19:23:12',
memo: '-',
},
];
const advancedOperation2 = [
{
key: 'op1',
type: '订购关系生效',
name: '曲丽丽',
status: 'agree',
updatedAt: '2017-10-03 19:23:12',
memo: '-',
},
];
const advancedOperation3 = [
{
key: 'op1',
type: '创建订单',
name: '汗牙牙',
status: 'agree',
updatedAt: '2017-10-03 19:23:12',
memo: '-',
},
];
const getProfileAdvancedData = {
advancedOperation1,
advancedOperation2,
advancedOperation3,
};
const { Random } = mockjs;
export default {
'GET /api/profile/advanced': getProfileAdvancedData,
'GET /api/profile/basic': (req, res) => {
const { id } = req.query;
const application = {
id,
status: '已取货',
orderNo: Random.id(),
childOrderNo: Random.id(),
};
const userInfo = {
name: Random.cname(),
tel: '18100000000',
delivery: '菜鸟物流',
addr: '浙江省杭州市西湖区万塘路18号',
remark: '备注',
};
res.json({
userInfo,
application,
basicGoods,
basicProgress,
});
},
};

View File

@@ -1,5 +0,0 @@
export default {
'/api/auth_routes': {
'/form/advanced-form': { authority: ['admin', 'user'] },
},
};

View File

@@ -1,131 +0,0 @@
import { parse } from 'url';
// mock tableListDataSource
let tableListDataSource = [];
for (let i = 0; i < 46; i += 1) {
tableListDataSource.push({
key: i,
disabled: i % 6 === 0,
href: 'https://ant.design',
avatar: [
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
][i % 2],
name: `TradeCode ${i}`,
title: `一个任务名称 ${i}`,
owner: '曲丽丽',
desc: '这是一段描述',
callNo: Math.floor(Math.random() * 1000),
status: Math.floor(Math.random() * 10) % 4,
updatedAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`),
createdAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`),
progress: Math.ceil(Math.random() * 100),
});
}
function getRule(req, res, u) {
let url = u;
if (!url || Object.prototype.toString.call(url) !== '[object String]') {
url = req.url; // eslint-disable-line
}
const params = parse(url, true).query;
let dataSource = tableListDataSource;
if (params.sorter) {
const s = params.sorter.split('_');
dataSource = dataSource.sort((prev, next) => {
if (s[1] === 'descend') {
return next[s[0]] - prev[s[0]];
}
return prev[s[0]] - next[s[0]];
});
}
if (params.status) {
const status = params.status.split(',');
let filterDataSource = [];
status.forEach(s => {
filterDataSource = filterDataSource.concat(
dataSource.filter(data => parseInt(data.status, 10) === parseInt(s[0], 10))
);
});
dataSource = filterDataSource;
}
if (params.name) {
dataSource = dataSource.filter(data => data.name.indexOf(params.name) > -1);
}
let pageSize = 10;
if (params.pageSize) {
pageSize = params.pageSize * 1;
}
const result = {
list: dataSource,
pagination: {
total: dataSource.length,
pageSize,
current: parseInt(params.currentPage, 10) || 1,
},
};
return res.json(result);
}
function postRule(req, res, u, b) {
let url = u;
if (!url || Object.prototype.toString.call(url) !== '[object String]') {
url = req.url; // eslint-disable-line
}
const body = (b && b.body) || req.body;
const { method, name, desc, key } = body;
switch (method) {
/* eslint no-case-declarations:0 */
case 'delete':
tableListDataSource = tableListDataSource.filter(item => key.indexOf(item.key) === -1);
break;
case 'post':
const i = Math.ceil(Math.random() * 10000);
tableListDataSource.unshift({
key: i,
href: 'https://ant.design',
avatar: [
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
][i % 2],
name: `TradeCode ${i}`,
title: `一个任务名称 ${i}`,
owner: '曲丽丽',
desc,
callNo: Math.floor(Math.random() * 1000),
status: Math.floor(Math.random() * 10) % 2,
updatedAt: new Date(),
createdAt: new Date(),
progress: Math.ceil(Math.random() * 100),
});
break;
case 'update':
tableListDataSource = tableListDataSource.map(item => {
if (item.key === key) {
Object.assign(item, { desc, name });
return item;
}
return item;
});
break;
default:
break;
}
return getRule(req, res, u);
}
export default {
'GET /api/rule': getRule,
'POST /api/rule': postRule,
};

View File

@@ -1,136 +0,0 @@
// 代码中会兼容本地 service mock 以及部署站点的静态数据
// import { stringify } from 'qs';
export default {
// 支持值为 Object 和 Array
'GET /api/currentUser': {
name: 'Serati Ma',
avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
userid: '00000001',
email: 'antdesign@alipay.com',
signature: '海纳百川有容乃大',
title: '交互专家',
group: '蚂蚁金服某某某事业群某某平台部某某技术部UED',
tags: [
{
key: '0',
label: '很有想法的',
},
{
key: '1',
label: '专注设计',
},
{
key: '2',
label: '~',
},
{
key: '3',
label: '大长腿',
},
{
key: '4',
label: '川妹子',
},
{
key: '5',
label: '海纳百川',
},
],
notifyCount: 12,
unreadCount: 11,
country: 'China',
geographic: {
province: {
label: '浙江省',
key: '330000',
},
city: {
label: '杭州市',
key: '330100',
},
},
address: '西湖区工专路 77 ',
phone: '0752-268888888',
},
// GET POST 可省略
'GET /api/users': [
{
key: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
},
{
key: '2',
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
},
{
key: '3',
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
},
],
'POST /admin-api/admins/passport/login': (req, res) => {
const { username } = req.body;
if (username === 'admin') {
res.send({
code: 0,
data: {
accessToken: '2e3d7635c15e47e997611707a237859f',
expiresIn: 2879,
refreshToken: 'd091e7c35bbb4313b0f557a6ef23d033',
},
message: 'string',
});
return;
}
res.send({
code: 1000,
data: {},
message: '账号或密码错误-mock!',
});
},
'POST /api/register': (req, res) => {
res.send({ status: 'ok', currentAuthority: 'user' });
},
'GET /api/500': (req, res) => {
res.status(500).send({
timestamp: 1513932555104,
status: 500,
error: 'error',
message: 'error',
path: '/base/category/list',
});
},
'GET /api/404': (req, res) => {
res.status(404).send({
timestamp: 1513932643431,
status: 404,
error: 'Not Found',
message: 'No message available',
path: '/base/category/list/2121212',
});
},
'GET /api/403': (req, res) => {
res.status(403).send({
timestamp: 1513932555104,
status: 403,
error: 'Unauthorized',
message: 'Unauthorized',
path: '/base/category/list',
});
},
'GET /api/401': (req, res) => {
res.status(401).send({
timestamp: 1513932555104,
status: 401,
error: 'Unauthorized',
message: 'Unauthorized',
path: '/base/category/list',
});
},
};

View File

@@ -1,13 +0,0 @@
[[redirects]]
from = "/api/*"
to = "https://us-central1-antd-pro.cloudfunctions.net/api/api/:splat"
status = 200
force = true
[redirects.headers]
X-From = "Netlify"
X-Api-Key = "some-api-key-string"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200

View File

@@ -1,144 +0,0 @@
{
"name": "ant-design-pro",
"version": "2.2.1",
"description": "An out-of-box UI solution for enterprise applications",
"private": true,
"scripts": {
"presite": "cd functions && npm install",
"start": "cross-env APP_TYPE=site umi dev",
"start:no-mock": "cross-env MOCK=none umi dev",
"start:admin-web": "cross-env BASE_PATH='/admin-web/' NODE_ENV=development APP_TYPE=site umi dev",
"start:admin-web:no-mock": "cross-env BASE_PATH='/admin-web/' NODE_ENV=development MOCK=none APP_TYPE=site umi dev",
"build": "cross-env BASE_PATH='/' NODE_ENV=production umi build",
"build:admin-web": "cross-env BASE_PATH='/admin-web/' NODE_ENV=production umi build",
"site": "npm run presite && cross-env APP_TYPE=site npm run build && firebase deploy && npm run docker:push",
"analyze": "cross-env ANALYZE=1 umi build",
"lint:style": "stylelint 'src/**/*.less' --syntax less",
"lint:prettier": "check-prettier lint",
"lint": "eslint --ext .js src mock tests && npm run lint:style && npm run lint:prettier",
"lint:fix": "eslint --fix --ext .js src mock tests && stylelint --fix 'src/**/*.less' --syntax less",
"lint-staged": "lint-staged",
"lint-staged:js": "eslint --ext .js",
"tslint": "npm run tslint:fix",
"tslint:fix": "tslint --fix 'src/**/*.ts*'",
"test": "umi test",
"test:component": "umi test ./src/components",
"test:all": "node ./tests/run-tests.js",
"prettier": "node ./scripts/prettier.js",
"docker:dev": "docker-compose -f ./docker/docker-compose.dev.yml up",
"docker:build": "docker-compose -f ./docker/docker-compose.dev.yml build",
"docker-prod:dev": "docker-compose -f ./docker/docker-compose.yml up",
"docker-prod:build": "docker-compose -f ./docker/docker-compose.yml build",
"docker-hub:build": "docker build -f Dockerfile.hub -t ant-design-pro ./",
"docker:tag": "docker tag ant-design-pro antdesign/ant-design-pro",
"docker:push": "npm run docker-hub:build && npm run docker:tag && docker push antdesign/ant-design-pro"
},
"dependencies": {
"@antv/data-set": "^0.10.1",
"@babel/runtime": "^7.3.1",
"antd": "^3.13.0",
"bizcharts": "^3.4.3",
"bizcharts-plugin-slider": "^2.1.1-beta.1",
"braft-editor": "^2.2.10",
"classnames": "^2.2.6",
"crypto": "^1.0.1",
"dva": "^2.4.1",
"enquire-js": "^0.2.1",
"hash.js": "^1.1.7",
"js-uuid": "0.0.6",
"lodash": "^4.17.11",
"lodash-decorators": "^6.0.1",
"memoize-one": "^5.0.0",
"moment": "^2.24.0",
"numeral": "^2.0.6",
"nzh": "^1.0.4",
"omit.js": "^1.0.0",
"path-to-regexp": "^3.0.0",
"prop-types": "^15.6.2",
"qiniu-js": "^2.5.4",
"qs": "^6.6.0",
"rc-animate": "^2.6.0",
"react": "^16.7.0",
"react-container-query": "^0.11.0",
"react-copy-to-clipboard": "^5.0.1",
"react-document-title": "^2.0.3",
"react-dom": "^16.7.0",
"react-fittext": "^1.0.0",
"react-media": "^1.9.2",
"react-router-dom": "^4.3.1"
},
"devDependencies": {
"@types/react": "^16.8.1",
"@types/react-dom": "^16.0.11",
"antd-pro-merge-less": "^1.0.0",
"antd-theme-webpack-plugin": "^1.2.0",
"babel-eslint": "^10.0.1",
"chalk": "^2.4.2",
"check-prettier": "^1.0.1",
"cross-env": "^5.2.0",
"cross-port-killer": "^1.0.1",
"enzyme": "3.8.0",
"eslint": "^5.13.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-config-prettier": "^4.0.0",
"eslint-plugin-babel": "^5.3.0",
"eslint-plugin-compat": "^2.6.3",
"eslint-plugin-import": "^2.16.0",
"eslint-plugin-jsx-a11y": "^6.2.0",
"eslint-plugin-markdown": "^1.0.0",
"eslint-plugin-react": "^7.12.4",
"gh-pages": "^2.0.1",
"husky": "^1.3.1",
"jest-puppeteer": "^3.9.0",
"less": "^3.9.0",
"lint-staged": "^8.1.1",
"merge-umi-mock-data": "^1.0.4",
"mockjs": "^1.0.1-beta3",
"prettier": "1.16.3",
"slash2": "^2.0.0",
"stylelint": "^9.10.1",
"stylelint-config-css-modules": "^1.3.0",
"stylelint-config-prettier": "^4.0.0",
"stylelint-config-rational-order": "^0.0.4",
"stylelint-config-standard": "^18.2.0",
"stylelint-declaration-block-no-ignored-properties": "^1.1.0",
"stylelint-order": "^2.0.0",
"tslint": "^5.12.1",
"tslint-config-prettier": "^1.17.0",
"tslint-react": "^3.6.0",
"umi": "^2.4.4",
"umi-plugin-ga": "^1.1.3",
"umi-plugin-react": "^1.4.2"
},
"optionalDependencies": {
"puppeteer": "^1.12.1"
},
"lint-staged": {
"**/*.{js,ts,tsx,json,jsx,less}": [
"node ./scripts/lint-prettier.js",
"git add"
],
"**/*.{js}": "npm run lint-staged:js",
"**/*.less": "stylelint --syntax less"
},
"engines": {
"node": ">=8.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 10"
],
"checkFiles": [
"src/**/*.js*",
"src/**/*.ts*",
"src/**/*.less",
"config/**/*.js*",
"scripts/**/*.js"
],
"husky": {
"hooks": {
"pre-commit": "npm run lint-staged"
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,3 +0,0 @@
const generateMock = require('merge-umi-mock-data');
const path = require('path');
generateMock(path.join(__dirname, '../mock'), path.join(__dirname, '../functions/mock/index.js'));

View File

@@ -1,21 +0,0 @@
const glob = require('glob');
const getPrettierFiles = () => {
let files = [];
const jsFiles = glob.sync('src/**/*.js*', { ignore: ['**/node_modules/**', 'build/**'] });
const tsFiles = glob.sync('src/**/*.ts*', { ignore: ['**/node_modules/**', 'build/**'] });
const configFiles = glob.sync('config/**/*.js*', { ignore: ['**/node_modules/**', 'build/**'] });
const scriptFiles = glob.sync('scripts/**/*.js');
const lessFiles = glob.sync('src/**/*.less*', { ignore: ['**/node_modules/**', 'build/**'] });
files = files.concat(jsFiles);
files = files.concat(tsFiles);
files = files.concat(configFiles);
files = files.concat(scriptFiles);
files = files.concat(lessFiles);
if (!files.length) {
return;
}
return files;
};
module.exports = getPrettierFiles;

View File

@@ -1,50 +0,0 @@
/**
* copy to https://github.com/facebook/react/blob/master/scripts/prettier/index.js
* prettier api doc https://prettier.io/docs/en/api.html
*----------*****--------------
* lint file is prettier
*----------*****--------------
*/
const prettier = require('prettier');
const fs = require('fs');
const chalk = require('chalk');
const prettierConfigPath = require.resolve('../.prettierrc');
const files = process.argv.slice(2);
let didError = false;
files.forEach(file => {
Promise.all([
prettier.resolveConfig(file, {
config: prettierConfigPath,
}),
prettier.getFileInfo(file),
])
.then(resolves => {
const [options, fileInfo] = resolves;
if (fileInfo.ignored) {
return;
}
const input = fs.readFileSync(file, 'utf8');
const withParserOptions = {
...options,
parser: fileInfo.inferredParser,
};
const output = prettier.format(input, withParserOptions);
if (output !== input) {
fs.writeFileSync(file, output, 'utf8');
console.log(chalk.green(`${file} is prettier`));
}
})
.catch(e => {
didError = true;
})
.finally(() => {
if (didError) {
process.exit(1);
}
console.log(chalk.hex('#1890FF')('prettier success!'));
});
});

View File

@@ -1,46 +0,0 @@
/**
* copy to https://github.com/facebook/react/blob/master/scripts/prettier/index.js
* prettier api doc https://prettier.io/docs/en/api.html
*----------*****--------------
* prettier all js and all ts.
*----------*****--------------
*/
const prettier = require('prettier');
const fs = require('fs');
const getPrettierFiles = require('./getPrettierFiles');
const prettierConfigPath = require.resolve('../.prettierrc');
const chalk = require('chalk');
let didError = false;
const files = getPrettierFiles();
files.forEach(file => {
const options = prettier.resolveConfig.sync(file, {
config: prettierConfigPath,
});
const fileInfo = prettier.getFileInfo.sync(file);
if (fileInfo.ignored) {
return;
}
try {
const input = fs.readFileSync(file, 'utf8');
const withParserOptions = {
...options,
parser: fileInfo.inferredParser,
};
const output = prettier.format(input, withParserOptions);
if (output !== input) {
fs.writeFileSync(file, output, 'utf8');
console.log(chalk.green(`${file} is prettier`));
}
} catch (e) {
didError = true;
}
});
if (didError) {
process.exit(1);
}
console.log(chalk.hex('#1890FF')('prettier success!'));

View File

@@ -1,48 +0,0 @@
// import fetch from 'dva/fetch';
import getAuthRoutesData from './mock-data/authRoutesData';
export const dva = {
config: {
onError(err) {
err.preventDefault();
},
},
};
let authRoutes = {};
function ergodicRoutes(routes, authKey, authority) {
routes.forEach(element => {
if (element.path === authKey) {
if (!element.authority) element.authority = []; // eslint-disable-line
Object.assign(element.authority, authority || []);
} else if (element.routes) {
ergodicRoutes(element.routes, authKey, authority);
}
return element;
});
}
export function patchRoutes(routes) {
Object.keys(authRoutes).map(authKey =>
ergodicRoutes(routes, authKey, authRoutes[authKey].authority)
);
window.g_routes = routes;
}
export function render(oldRender) {
// fetch('/api/auth_routes')
// .then(res => res.json())
// .then(
// ret => {
// authRoutes = ret;
// oldRender();
// },
// () => {
// oldRender();
// }
// );
authRoutes = getAuthRoutesData;
oldRender();
}

View File

@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch -->
<title>Group 28 Copy 5</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="62.1023273%" y1="0%" x2="108.19718%" y2="37.8635764%" id="linearGradient-1">
<stop stop-color="#4285EB" offset="0%"></stop>
<stop stop-color="#2EC7FF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="69.644116%" y1="0%" x2="54.0428975%" y2="108.456714%" id="linearGradient-2">
<stop stop-color="#29CDFF" offset="0%"></stop>
<stop stop-color="#148EFF" offset="37.8600687%"></stop>
<stop stop-color="#0A60FF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="69.6908165%" y1="-12.9743587%" x2="16.7228981%" y2="117.391248%" id="linearGradient-3">
<stop stop-color="#FA816E" offset="0%"></stop>
<stop stop-color="#F74A5C" offset="41.472606%"></stop>
<stop stop-color="#F51D2C" offset="100%"></stop>
</linearGradient>
<linearGradient x1="68.1279872%" y1="-35.6905737%" x2="30.4400914%" y2="114.942679%" id="linearGradient-4">
<stop stop-color="#FA8E7D" offset="0%"></stop>
<stop stop-color="#F74A5C" offset="51.2635191%"></stop>
<stop stop-color="#F51D2C" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="logo" transform="translate(-20.000000, -20.000000)">
<g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)">
<g id="Group-27-Copy-3">
<g id="Group-25" fill-rule="nonzero">
<g id="2">
<path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-1)"></path>
<path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-2)"></path>
</g>
<path d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z" id="Shape" fill="url(#linearGradient-3)"></path>
</g>
<ellipse id="Combined-Shape" fill="url(#linearGradient-4)" cx="100.519339" cy="100.436681" rx="23.6001926" ry="23.580786"></ellipse>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,98 +0,0 @@
import React, { Component } from 'react';
import { MiniArea } from '../Charts';
import NumberInfo from '../NumberInfo';
import styles from './index.less';
function fixedZero(val) {
return val * 1 < 10 ? `0${val}` : val;
}
function getActiveData() {
const activeData = [];
for (let i = 0; i < 24; i += 1) {
activeData.push({
x: `${fixedZero(i)}:00`,
y: Math.floor(Math.random() * 200) + i * 50,
});
}
return activeData;
}
export default class ActiveChart extends Component {
state = {
activeData: getActiveData(),
};
componentDidMount() {
this.loopData();
}
componentWillUnmount() {
clearTimeout(this.timer);
cancelAnimationFrame(this.requestRef);
}
loopData = () => {
this.timer = setTimeout(() => {
this.setState(
{
activeData: getActiveData(),
},
() => {
this.loopData();
}
);
}, 500);
};
render() {
const { activeData = [] } = this.state;
return (
<div className={styles.activeChart}>
<NumberInfo subTitle="目标评估" total="有望达到预期" />
<div style={{ marginTop: 32 }}>
<MiniArea
animate={false}
line
borderWidth={2}
height={84}
scale={{
y: {
tickCount: 3,
},
}}
yAxis={{
tickLine: false,
label: false,
title: false,
line: false,
}}
data={activeData}
/>
</div>
{activeData && (
<div>
<div className={styles.activeChartGrid}>
<p>{[...activeData].sort()[activeData.length - 1].y + 200} 亿元</p>
<p>{[...activeData].sort()[Math.floor(activeData.length / 2)].y} 亿元</p>
</div>
<div className={styles.dashedLine}>
<div className={styles.line} />
</div>
<div className={styles.dashedLine}>
<div className={styles.line} />
</div>
</div>
)}
{activeData && (
<div className={styles.activeChartLegend}>
<span>00:00</span>
<span>{activeData[Math.floor(activeData.length / 2)].x}</span>
<span>{activeData[activeData.length - 1].x}</span>
</div>
)}
</div>
);
}
}

View File

@@ -1,51 +0,0 @@
.activeChart {
position: relative;
}
.activeChartGrid {
p {
position: absolute;
top: 80px;
}
p:last-child {
top: 115px;
}
}
.activeChartLegend {
position: relative;
height: 20px;
margin-top: 8px;
font-size: 0;
line-height: 20px;
span {
display: inline-block;
width: 33.33%;
font-size: 12px;
text-align: center;
}
span:first-child {
text-align: left;
}
span:last-child {
text-align: right;
}
}
.dashedLine {
position: relative;
top: -70px;
left: -3px;
height: 1px;
.line {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: linear-gradient(to right, transparent 50%, #e9e9e9 50%);
background-size: 6px;
}
}
.dashedLine:last-child {
top: -36px;
}

View File

@@ -1,17 +0,0 @@
import React from 'react';
import moment from 'moment';
import { Avatar } from 'antd';
import styles from './index.less';
const ArticleListContent = ({ data: { content, updatedAt, avatar, owner, href } }) => (
<div className={styles.listContent}>
<div className={styles.description}>{content}</div>
<div className={styles.extra}>
<Avatar src={avatar} size="small" />
<a href={href}>{owner}</a> 发布在 <a href={href}>{href}</a>
<em>{moment(updatedAt).format('YYYY-MM-DD HH:mm')}</em>
</div>
</div>
);
export default ArticleListContent;

View File

@@ -1,38 +0,0 @@
@import '~antd/lib/style/themes/default.less';
.listContent {
.description {
max-width: 720px;
line-height: 22px;
}
.extra {
margin-top: 16px;
color: @text-color-secondary;
line-height: 22px;
& > :global(.ant-avatar) {
position: relative;
top: 1px;
width: 20px;
height: 20px;
margin-right: 8px;
vertical-align: top;
}
& > em {
margin-left: 16px;
color: @disabled-color;
font-style: normal;
}
}
}
@media screen and (max-width: @screen-xs) {
.listContent {
.extra {
& > em {
display: block;
margin-top: 8px;
margin-left: 0;
}
}
}
}

View File

@@ -1,15 +0,0 @@
---
使用 demo
authKey: 代表key的权限
---
```jsx harmony
<AuthorityControl authKey="home.button">
<Button type="primary">按钮 控制</Button>
</AuthorityControl>
```

View File

@@ -1,7 +0,0 @@
import * as React from 'react';
export interface AuthorityControlProps {
authKey: string;
}
export default class LoginItem extends React.Component<AuthorityControlProps, any> {}

View File

@@ -1,19 +0,0 @@
import React, { PureComponent } from 'react';
import UrlsContext from '../../layouts/UrlsContext';
// 用于控制权限
class AuthorityControl extends PureComponent {
render() {
const { authKey, children } = this.props;
return (
<UrlsContext.Consumer>
{context => {
const { authList } = context;
return <div>{authList[authKey] ? children : '无权限'}</div>;
}}
</UrlsContext.Consumer>
);
}
}
export default AuthorityControl;

View File

@@ -1,8 +0,0 @@
import CheckPermissions from './CheckPermissions';
const Authorized = ({ children, authority, noMatch = null }) => {
const childrenRender = typeof children === 'undefined' ? null : children;
return CheckPermissions(authority, childrenRender, noMatch);
};
export default Authorized;

View File

@@ -1,13 +0,0 @@
import * as React from 'react';
import { RouteProps } from 'react-router';
type authorityFN = (currentAuthority?: string) => boolean;
type authority = string | string[] | authorityFN | Promise<any>;
export interface IAuthorizedRouteProps extends RouteProps {
authority: authority;
}
export { authority };
export default class AuthorizedRoute extends React.Component<IAuthorizedRouteProps, any> {}

View File

@@ -1,15 +0,0 @@
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import Authorized from './Authorized';
// TODO: umi只会返回render和rest
const AuthorizedRoute = ({ component: Component, render, authority, redirectPath, ...rest }) => (
<Authorized
authority={authority}
noMatch={<Route {...rest} render={() => <Redirect to={{ pathname: redirectPath }} />} />}
>
<Route {...rest} render={props => (Component ? <Component {...props} /> : render(props))} />
</Authorized>
);
export default AuthorizedRoute;

View File

@@ -1,88 +0,0 @@
import React from 'react';
import PromiseRender from './PromiseRender';
import { CURRENT } from './renderAuthorize';
function isPromise(obj) {
return (
!!obj &&
(typeof obj === 'object' || typeof obj === 'function') &&
typeof obj.then === 'function'
);
}
/**
* 通用权限检查方法
* Common check permissions method
* @param { 权限判定 Permission judgment type string |array | Promise | Function } authority
* @param { 你的权限 Your permission description type:string} currentAuthority
* @param { 通过的组件 Passing components } target
* @param { 未通过的组件 no pass components } Exception
*/
const checkPermissions = (authority, currentAuthority, target, Exception) => {
// 没有判定权限.默认查看所有
// Retirement authority, return target;
if (!authority) {
return target;
}
// 数组处理
if (Array.isArray(authority)) {
if (authority.indexOf(currentAuthority) >= 0) {
return target;
}
if (Array.isArray(currentAuthority)) {
for (let i = 0; i < currentAuthority.length; i += 1) {
const element = currentAuthority[i];
if (authority.indexOf(element) >= 0) {
return target;
}
}
}
return Exception;
}
// string 处理
if (typeof authority === 'string') {
if (authority === currentAuthority) {
return target;
}
if (Array.isArray(currentAuthority)) {
for (let i = 0; i < currentAuthority.length; i += 1) {
const element = currentAuthority[i];
if (authority === element) {
return target;
}
}
}
return Exception;
}
// Promise 处理
if (isPromise(authority)) {
return <PromiseRender ok={target} error={Exception} promise={authority} />;
}
// Function 处理
if (typeof authority === 'function') {
try {
const bool = authority(currentAuthority);
// 函数执行后返回值是 Promise
if (isPromise(bool)) {
return <PromiseRender ok={target} error={Exception} promise={bool} />;
}
if (bool) {
return target;
}
return Exception;
} catch (error) {
throw error;
}
}
throw new Error('unsupported parameters');
};
export { checkPermissions };
const check = (authority, target, Exception) =>
checkPermissions(authority, CURRENT, target, Exception);
export default check;

View File

@@ -1,55 +0,0 @@
import { checkPermissions } from './CheckPermissions';
const target = 'ok';
const error = 'error';
describe('test CheckPermissions', () => {
it('Correct string permission authentication', () => {
expect(checkPermissions('user', 'user', target, error)).toEqual('ok');
});
it('Correct string permission authentication', () => {
expect(checkPermissions('user', 'NULL', target, error)).toEqual('error');
});
it('authority is undefined , return ok', () => {
expect(checkPermissions(null, 'NULL', target, error)).toEqual('ok');
});
it('currentAuthority is undefined , return error', () => {
expect(checkPermissions('admin', null, target, error)).toEqual('error');
});
it('Wrong string permission authentication', () => {
expect(checkPermissions('admin', 'user', target, error)).toEqual('error');
});
it('Correct Array permission authentication', () => {
expect(checkPermissions(['user', 'admin'], 'user', target, error)).toEqual('ok');
});
it('Wrong Array permission authentication,currentAuthority error', () => {
expect(checkPermissions(['user', 'admin'], 'user,admin', target, error)).toEqual('error');
});
it('Wrong Array permission authentication', () => {
expect(checkPermissions(['user', 'admin'], 'guest', target, error)).toEqual('error');
});
it('Wrong Function permission authentication', () => {
expect(checkPermissions(() => false, 'guest', target, error)).toEqual('error');
});
it('Correct Function permission authentication', () => {
expect(checkPermissions(() => true, 'guest', target, error)).toEqual('ok');
});
it('authority is string, currentAuthority is array, return ok', () => {
expect(checkPermissions('user', ['user'], target, error)).toEqual('ok');
});
it('authority is string, currentAuthority is array, return ok', () => {
expect(checkPermissions('user', ['user', 'admin'], target, error)).toEqual('ok');
});
it('authority is array, currentAuthority is array, return ok', () => {
expect(checkPermissions(['user', 'admin'], ['user', 'admin'], target, error)).toEqual('ok');
});
it('Wrong Function permission authentication', () => {
expect(checkPermissions(() => false, ['user'], target, error)).toEqual('error');
});
it('Correct Function permission authentication', () => {
expect(checkPermissions(() => true, ['user'], target, error)).toEqual('ok');
});
it('authority is undefined , return ok', () => {
expect(checkPermissions(null, ['user'], target, error)).toEqual('ok');
});
});

View File

@@ -1,65 +0,0 @@
import React from 'react';
import { Spin } from 'antd';
export default class PromiseRender extends React.PureComponent {
state = {
component: null,
};
componentDidMount() {
this.setRenderComponent(this.props);
}
componentDidUpdate(nextProps) {
// new Props enter
this.setRenderComponent(nextProps);
}
// set render Component : ok or error
setRenderComponent(props) {
const ok = this.checkIsInstantiation(props.ok);
const error = this.checkIsInstantiation(props.error);
props.promise
.then(() => {
this.setState({
component: ok,
});
})
.catch(() => {
this.setState({
component: error,
});
});
}
// Determine whether the incoming component has been instantiated
// AuthorizedRoute is already instantiated
// Authorized render is already instantiated, children is no instantiated
// Secured is not instantiated
checkIsInstantiation = target => {
if (!React.isValidElement(target)) {
return target;
}
return () => target;
};
render() {
const { component: Component } = this.state;
const { ok, error, promise, ...rest } = this.props;
return Component ? (
<Component {...rest} />
) : (
<div
style={{
width: '100%',
height: '100%',
margin: 'auto',
paddingTop: 50,
textAlign: 'center',
}}
>
<Spin size="large" />
</div>
);
}
}

View File

@@ -1,55 +0,0 @@
import React from 'react';
import Exception from '../Exception';
import CheckPermissions from './CheckPermissions';
/**
* 默认不能访问任何页面
* default is "NULL"
*/
const Exception403 = () => <Exception type="403" />;
// Determine whether the incoming component has been instantiated
// AuthorizedRoute is already instantiated
// Authorized render is already instantiated, children is no instantiated
// Secured is not instantiated
const checkIsInstantiation = target => {
if (!React.isValidElement(target)) {
return target;
}
return () => target;
};
/**
* 用于判断是否拥有权限访问此view权限
* authority 支持传入 string, function:()=>boolean|Promise
* e.g. 'user' 只有user用户能访问
* e.g. 'user,admin' user和 admin 都能访问
* e.g. ()=>boolean 返回true能访问,返回false不能访问
* e.g. Promise then 能访问 catch不能访问
* e.g. authority support incoming string, function: () => boolean | Promise
* e.g. 'user' only user user can access
* e.g. 'user, admin' user and admin can access
* e.g. () => boolean true to be able to visit, return false can not be accessed
* e.g. Promise then can not access the visit to catch
* @param {string | function | Promise} authority
* @param {ReactNode} error 非必需参数
*/
const authorize = (authority, error) => {
/**
* conversion into a class
* 防止传入字符串时找不到staticContext造成报错
* String parameters can cause staticContext not found error
*/
let classError = false;
if (error) {
classError = () => error;
}
if (!authority) {
throw new Error('authority is required');
}
return function decideAuthority(target) {
const component = CheckPermissions(authority, target, classError || Exception403);
return checkIsInstantiation(component);
};
};
export default authorize;

View File

@@ -1,23 +0,0 @@
---
order: 1
title:
zh-CN: 使用数组作为参数
en-US: Use Array as a parameter
---
Use Array as a parameter
```jsx
import RenderAuthorized from 'ant-design-pro/lib/Authorized';
import { Alert } from 'antd';
const Authorized = RenderAuthorized('user');
const noMatch = <Alert message="No permission." type="error" showIcon />;
ReactDOM.render(
<Authorized authority={['user', 'admin']} noMatch={noMatch}>
<Alert message="Use Array as a parameter passed!" type="success" showIcon />
</Authorized>,
mountNode,
);
```

View File

@@ -1,31 +0,0 @@
---
order: 2
title:
zh-CN: 使用方法作为参数
en-US: Use function as a parameter
---
Use Function as a parameter
```jsx
import RenderAuthorized from 'ant-design-pro/lib/Authorized';
import { Alert } from 'antd';
const Authorized = RenderAuthorized('user');
const noMatch = <Alert message="No permission." type="error" showIcon />;
const havePermission = () => {
return false;
};
ReactDOM.render(
<Authorized authority={havePermission} noMatch={noMatch}>
<Alert
message="Use Function as a parameter passed!"
type="success"
showIcon
/>
</Authorized>,
mountNode,
);
```

View File

@@ -1,25 +0,0 @@
---
order: 0
title:
zh-CN: 基本使用
en-US: Basic use
---
Basic use
```jsx
import RenderAuthorized from 'ant-design-pro/lib/Authorized';
import { Alert } from 'antd';
const Authorized = RenderAuthorized('user');
const noMatch = <Alert message="No permission." type="error" showIcon />;
ReactDOM.render(
<div>
<Authorized authority="admin" noMatch={noMatch}>
<Alert message="user Passed!" type="success" showIcon />
</Authorized>
</div>,
mountNode,
);
```

View File

@@ -1,28 +0,0 @@
---
order: 3
title:
zh-CN: 注解基本使用
en-US: Basic use secured
---
secured demo used
```jsx
import RenderAuthorized from 'ant-design-pro/lib/Authorized';
import { Alert } from 'antd';
const { Secured } = RenderAuthorized('user');
@Secured('admin')
class TestSecuredString extends React.Component {
render() {
<Alert message="user Passed!" type="success" showIcon />;
}
}
ReactDOM.render(
<div>
<TestSecuredString />
</div>,
mountNode,
);
```

Some files were not shown because too many files have changed in this diff Show More