延续上篇,通过切片来具体实现对应注解: 第一步:使用@Aspect注解定义类@Aspect @Component public class QLMLogAspect {}第二步:定义切入点(关联对应注解模式)@Pointcut("@annotation(org.qlm.common.annotation.RecordSysLog)") public void logPointCut(
现代Java编程大量使用注解,可以很方便的简化编程,提高编程效率。作为一个平台,也定义了自己的注解。过程如下: 第一步新建java文件,非常类似接口类:import java.lang.annotation.*; public @interface RecordSysLog{} &nbs
整个平台待办是统一处理的,各业务微服务需要产生待办时调用系统API<dependency> <groupId>org.qlm</groupId> <artifactId>qlm-api</artifactId> <version>1.0-SNAPSHOT</version> </dep
平台所有业务操作都存储在核心库,以便统一分析处理。各业务微服务通过feign调用核心日志服务。底层提供了API:<dependency> <groupId>org.qlm</groupId> <artifactId>qlm-api</artifactId> <version>1.0-SNAPSHOT&l
swagger可以在线生成接口文档,便于前后端沟通,而且还可以在线调用接口,方便后台调试。但是接口需要经过登录校验,部分接口还需要得到登录token,使用token识别用户身份进行后续操作。这种情况下,都需要接口增加header,好携带认证信息。 swagger2和swagger3有很大不同,平台选用的是swagger3。网上很多解决方案都是s
平台采用jpa+hibernate访问数据库,返回是数据对象的列表,例如学生对象studentBO。访问属性使用.符号,例如studentA.getName()。如果想编一个通用的处理功能,就需要在不知道具体类的情况下,通过属性名字来访问。使用Object类可以承载一切类,例如可以代替studentBO、teacherBO。但是不能用o.getName来访问其姓名了,这个时候就要用到反
系统里大量存在查询界面,例如A框为模糊查询条件,里面输入文字a,系统后台会拼接SQL条件 A like '%a%'。B框为等于条件,输入b,后台翻译为B='b'。看起来没有什么问题,但是偏偏黑客哥会使用这个漏洞,例如B=‘b'这个,黑哥会在录入框里输入1' or '1'='1,带入后得到B='1' or '1'='1' 成了永真条件,造成数据泄露,这就是SQL注入。防止起来也没什么秘密
平台提倡链式编程。所谓链式编程就是把过去多行的语句通过.符号串联为一句(注意为了可读性,往往通过在.符号处换行),直观的对比如下: 非链式: object.setPropertyA(A); &nb
底层集成了很多类,例如对微信支付的支持:@Configuration @Component public class WeChartPayConfig implements ApplicationRunner { @Value("${qlm.wechart.appid}") public String appId; @Value("${qlm.wechart.
这个问题在平台上的难点在于:待办是在门户系统里,待办的处理是在另一个独立的前端工程里,两者是跨域关系。当然这两个系统都是同一个浏览器打开的。跨域页面通讯技术的核心是:消息监听。 1、门户主界面的vue页面的create中挂接消息监听: let that
平台采取了如下安全措施:1、采用短信验证时,限制同一手机号当天最大发送N次(在参数管理中配置)2、累计密码验证错误超过N次时(在参数管理中配置),账号锁定。3、查询接口对输入的查询参数进行防注入处理。4、不细分用户不存在、密码错场景,通通报 用户或密码错。5、关闭nginx的版本显示 server_tokens off
元芳,你怎么看?单一数据库自身就有一些不同处理之处,如果一个平台要兼容所有数据库,就是难上加难,像isnull函数各数据库就不同。对于这类问题,平台采用统一自定义函数解决,例如上面的round函数,所有程序一律写完my_round。然后在数据库里利用自定义函数编写my_round
1) 显示SQL语句及其参数nacos里配置spring: jpa: show-sql: truelogback-spring.xml里配置<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>2)feign显示调用过程logg
为增强安全性,平台可安装ssl证书。对于平台不同的组成部分需要采用不同的方式,使用不同的证书格式: 一、前端 前端采用nginx部署,安装证书步骤如下(linux window版一样):
1、下载jdk https://mirrors.huaweicloud.com/java/jdk/2、在线解析二维码 http://cdn.malu.me/qrdecode/3、Properties和Yaml格式互转 https://www.toyaml.com/index.html4、生成ban
按开发文档和正常理解,el-table-column具有属性align,可以填left,center,right控制内容的对齐方式。你真正做的时候,就会发现根本不起作用。 查网络,大部分怀疑你用错属性了,elment-ui版本不对,css冲突等等。 还有这样的解决方案:el-table增加&nb
平台通过zxing来生成二维码 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> <de
订单信息分为两层,业务层和微信层,业务层保留订单的详细信息,微信层只有总金额信息。业务层平台不关心,只提供微信层的封装方法。 需引入微信支付包:<groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclie
平台上支持定时任务,基本思路是自己开发微服务,通过平台的配置和调度来管理这些定时微服务。 1、参照qlm-job工程,做自己的定时任务。例如: 2、配置定时任务。在前端页面或数据库中直接配置。其中task_target指定调用那个类那个函数cron_expression指定调用频
一、单向传递1、父通过参数调用子,单项传递。 在子组件里通过props定义参数,例如props:["para1","para2"],父组件里用:para1="value1" :para2="value2"传递参数。 平台推荐上述用法2、父通过$refs取得子的数据 父给子起名: r
有些权限我称之为业务权限,这种权限和业务绑定,就不在平台底层的权限管理中处理了。举一个场景来解释这个问题。在赛事服务平台中,一个机构有多个业务员,业务员可以发展自己的合作学校,各个业务员之间不允许看各自的学校。业务员之上的管理人员可以查看所有学校。这一场景中,合作学校的数据是业务数据,平台底层是不感知的,所以不可能在平台级别的权限管理中进行定义。在平台级别只能区分出业务员和管理者,定义后在后台数据
赛事平台业务上需要生成参赛证或奖状,平台采用定义PDF模板,使用ITEXT操作PDF文件,使用信息填充的技术路线。其中最核心的函数是:<groupId>org.qlm</groupId> <artifactId>qlm-utils-pdf</artifactId> <version>1.0-SNAPSHOT</version>
移动前端有多种形态,对于管理系统领域主要有4种形态:H5、微信小程序、钉钉小程序、飞书小程序。采用uniapp+条件编译等手段可以做到一套源码编译成多个应用端。但是在实际应用时还有个账号统一的问题。例如H5版要和微信小程序账号一致(注意还有PC端)。这些应用注册不分先后。平台采用如下策略(以微信小程序为例): 微信小程序运行时,先用openid
后台接口用swagger3来管理。之前有些老项目使用了swagger2,强制要求升级到swagger3.2和3之前差异太大:我们的平台尽量不产生如此大的变动。升级总是会带来各种各样的问题,搞向下兼容消耗的资源也是巨大的。微软这样的金主都放弃了操作系统、浏览器早期版本的维护。 后台开发人员,先用swagger来测试接口,因为系统有登录验证,测试不
<dependency> <groupId>org.qlm</groupId> <artifactId>qlm-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency>以上组件封装了平台的banner,不做
前端时间忙着搞赛事平台总体设计。今天开始恢复平台开发指南的发布。平台设计了查询运行系统版本的能力。 微服务整体版本标识:在发行包目录中的bootstrap.yml配置文件中如下定义qlm: serverName: 千里马平台资源服务 version: 1.0.100访问微服务对应的端口的/version端口
src/utils/qlm_store.js封装了前端存储底层函数。登录后的用户信息都是通过调用底层函数进行保存的。/* * key 键值 * StoreType:存储位置 cookie|session|localStorage * 调用时不输入该参数时,存储位置由QLMConfig.qlm_jwt_store配置决定&
移动前端采用uniapp架构,主要目录如下:src api 访问后台的接口文件,协议同pc前端 static 静态文件 store vuex utils 工具 style 风格 route 路由 pages 页面文件&
平台为了保证统一性,做了很多约定,例如按钮图标等,平台规定图标取自这两个地方。在整个平台上运行的系统必须保持一致。在这个层面上不允许个性发挥。1) font-awesomeimport 'font-awesome/css/font-awesome.min.css' // font-awesome 查图标:https://www.runoob.com/f
平台前端架构启动后,在store里存储了很多信息,可以通过getter取到:1)访问tokenimport { getToken } from '@/utils/qlm_auth'getToken()可以获取该值为空则没有登录2) 用户信息this.$store.getters.userId // 用户IDthis.$s
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号