当前位置: 首页 > news >正文

网站设计需求分析废旧回收做哪个网站好

网站设计需求分析,废旧回收做哪个网站好,网页设计师考证,怎么去跟客户谈网站建设数据字典 Web项目开发中#xff0c;字典表的一般都会存在#xff0c;主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示#xff0c;在存储数据和查询数据的时候#xff0c;就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物…数据字典 Web项目开发中字典表的一般都会存在主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示在存储数据和查询数据的时候就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物类型包含老虎-1、海豚-2、大象-3、长颈鹿-4等等做答题处理时的答题类型比如单选题、多选题、填空题等等 比较常用的有用户类型普通用户还是VIP用户等等这些类型的数据也可以存储在数据字典中进行统一处理。 数据结构以及业务 举例 在业务表中使用的是业务目录而其中的“数据结构”“数据目录类型”“数据来源”使用的是字典表中的id但我们在页面显示的时候想用字典表中的value值即我们在库里相应的业务表的外键存字典表的ID查询的时候返回给前端在字典表中的value字段。 如以下表以及内容的展示 目录表 内容 外键字典的ID 如图所示字典表需要我们在表中拿出外键所对应的Label 列举方法 那有什么办法可以让我们查询出key的同时将value值也查询出来当时处理问题的时候想了三种解决方法 1.要么就写sql 匹配。(在SQL查询的时候做字段的匹配但是增加了SQL的复杂性不易维护) 2.要么就业务处理。得写个工具类针对当时的情况感觉可以实现然后查找了一些资料比如自定义注解啥的 3.再就是前端调两次接口查询一次数据再查询一次字典表做转译。所涉及到的字段有四五个甚至更多这是我问的别的同学他们公司采用的就是这种方法 根据查找资料以及实际考虑最终采用了使用自定义注解的方式去做字段映射。 实现步骤 首先展示项目的目录结构 总共三个自定义注解切面具体实现 一 创建自定义注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) Documented public interface Dict {/*** 字典类型对应数据库的类型下方展示*/String dictType();/*** 实体类内对应的中文字段名默认为“当前字段Text”* p* 例如当前字段为“type”则对应中文字段默认为“typeText”* 就是你在实体中想要给某个字段赋值这个字段就要写成那个字段*/String dictField() default ;} 二创建切面 Slf4j Aspect Component public class BydDaoDictAspect { // * Pointcut 注解用于定义一个切点切点是决定哪些方法应该被通知advice的表达式。 // * execution(* com.wiseom.asset.manage.service..*.*(..)) 是一个切点表达式它表示匹配 com.wiseom.asset.manage.service 包及其子包下的所有类的所有方法。 // * doPointcut() 方法本身没有执行任何操作它只是为切点提供了一个标识符。Pointcut(execution(* com.wiseom.asset.manage.service..*.*(..)))public void doPointcut() {} // * AfterReturning 注解表示在匹配的方法成功执行并返回结果后执行通知。 // * pointcut doPointcut() 表示这个通知应用于之前定义的 doPointcut 切点。 // * returning result 捕获返回的结果并将其作为 result 参数传递给通知方法。 // * 在 doAfterReturning 方法中DictUtils.convertDict(result) 是将返回的 result 对象转换为字典格式。如果在转换过程中发生异常它会被捕获并记录到日志中。AfterReturning(pointcut doPointcut(), returning result)public void doAfterReturning(JoinPoint pjp, Object result) {try {DictUtils.convertDict(result);} catch (Exception e) {log.error(String.valueOf(e));}} }备注 1切点在com.wiseom.asset.manage.service的原因因为我们使用了mybitsplus 在我们处理查询或者执行SQL的时候大多都在service层就被处理了所以切点设在了service层。 2如果切点设置在Controller则需要修改下方实现三中的 方法 convertDict因为 Controller的返回值拿到的是 R 包裹的内容返回值对象是R,而不是实体具体问题查看下方的扩展四 三创建实现 Component public class DictUtils {private static final String DICT_FIELD_SUFFIX Text;/*** 统一获取当前实体类涉及到的字典表数据避免多次查询数据库造成的性能消耗* 这个工具类主要的改动就是这个所以我就把这一段放在上面了* param dictNames 字典表type值* return 字典表数据*/SneakyThrowsprivate static MapString, MapLong, String getDictMap(ListString dictNames) {//创建fegin的实例调用系统的sys_dict_item表需要新写一个接口final RemoteDictService remoteDictService SpringContextHolder.getBean(RemoteDictService.class);//把注解里的所有字典的类型查出来具体根据需求做查询ListSysDictItem dictList remoteDictService.getDictItemByType(dictNames);//根据类型做一个分组,这里对应的是 MapDictType, MapID, Labelreturn dictList.stream().collect(Collectors.groupingBy(SysDictItem::getDictType, Collectors.toMap(SysDictItem::getId, SysDictItem::getLabel, (v1, v2) - v2)));}/*** 这是主方法主要是判断AOP后返回的内容并根据判断条件拿到里面的内容* 然后先判断有哪些带有注解根据注解拿到对应的dictType去库里查找对应的内容 * 根据拿到内容在对指定的字段dictField进行赋值*/public static void convertDict(Object target) {//判断对象是不是分页的if (target instanceof Page) {//拿到分页中的records对象里边包含实体的内容for(Object object : ((Page?)target).getRecords()){//拿到实体ListDictDefinition dictDefinitions getMetadata(object);// 如果没有注解则直接返回if (CollectionUtils.isEmpty(dictDefinitions)) return;// 从字典定义中提取所有的注解的 dictType(数据库字典的类型)ListString dictNames dictDefinitions.stream().map(d - d.getDict().dictType()).collect(Collectors.toList());// 根据字典类型获取字典映射MapString, MapLong, String dictMapMap getDictMap(dictNames);// 转换target对象的字典字段doConvertDict(object, dictDefinitions, dictMapMap);}} elseif (target instanceof List) {// 将target强制转换为List?类型List? objectList ((List?) target);// 使用CollectionUtils.isNotEmpty来检查列表是否非空if (CollectionUtils.isNotEmpty(objectList)) {// 获取列表中第一个元素的字典定义ListDictDefinition dictDefinitions getMetadata(objectList.get(0));// 如果没有注解则直接返回if (CollectionUtils.isEmpty(dictDefinitions)) return;// 从字典定义中提取所有的注解的 dictType(数据库字典的类型)ListString dictNames dictDefinitions.stream().map(d - d.getDict().dictType()).collect(Collectors.toList());// 根据字典类型获取字典映射MapString, MapLong, String dictMapMap getDictMap(dictNames);// 遍历列表中的每个元素并转换其字典字段objectList.forEach(t - doConvertDict(t, dictDefinitions, dictMapMap));}} else {// 如果target不是List则直接获取其字典定义ListDictDefinition dictDefinitions getMetadata(target);// 如果没有注解则直接返回if (CollectionUtils.isEmpty(dictDefinitions)) return;// 从字典定义中提取所有的注解的 dictType(数据库字典的类型)ListString dictNames dictDefinitions.stream().map(d - d.getDict().dictType()).collect(Collectors.toList());// 根据字典类型获取字典映射MapString, MapLong, String dictMapMap getDictMap(dictNames);// 转换target对象的字典字段doConvertDict(target, dictDefinitions, dictMapMap);}}/*** 仅获取一次Dict元数据降低多次反射造成的性能消耗* param target 目标实体类* return Dict元数据*/private static ListDictDefinition getMetadata(Object target) {//这一段是判断存在注解的字段ListDictDefinition dictDefinitions new ArrayList();if (ClassUtils.isPrimitiveOrWrapper(target.getClass())|| target instanceof Map || target instanceof String) {return dictDefinitions;}ListField fields FieldUtils.getAllFieldsList(target.getClass());for (Field field : fields) {Dict dict AnnotationUtils.getAnnotation(field, Dict.class);if (dict ! null) {DictDefinition dictDefinition new DictDefinition();dictDefinition.setDict(dict);dictDefinition.setField(field);dictDefinitions.add(dictDefinition);}}return dictDefinitions;}SneakyThrowsprivate static void doConvertDict(Object target, ListDictDefinition dictDefinitions,MapString, MapLong, String dictMapMap) {for (DictDefinition dictDefinition : dictDefinitions) {//获取Dict注解和字段信息Dict dict dictDefinition.getDict();Field field dictDefinition.getField();//获取字典映射MapLong, String dictMap dictMapMap.get(dict.dictType());//读取实体中带有注解的字段原有的值String dictCode String.valueOf(FieldUtils.readField(target, field.getName(), true));//类型转换我在库中用的存储的字段是String所以需要进行类型的转换如果你的库设置的不是或者其他的类型需要注意到这个地方Long longDictCodeLong.valueOf(dictCode);//拿到字典注解的labelString dictField StringUtils.isEmpty(dict.dictField()) ? field.getName() DICT_FIELD_SUFFIX : dict.dictField();//设置字段的字典文本值FieldUtils.writeField(target, dictField, dictMap.get(longDictCode), true);}}Datapublic static class DictDefinition {private Dict dict;private Field field;}}系统表的查询接口 //这个我是在SysDictController下添加的接口目的是实现查找多个类型的内容同时还需要写个fegin接口以供别的模块使用 /*** 通过字典类型查找字典* param types 类型* return 同类型字典*/PostMapping(/types)public ListSysDictItem getDictByTypes(RequestBody ListString types) {return sysDictItemService.list(Wrappers.SysDictItemquery().lambda().in(SysDictItem::getDictType, types));} 使用方法 直接在实体字段上方添加注解 1.dictType数据库中的字典的类型 2.dictField实体中赋值的字段 如上方使用方法所示如果你想将字典中的label值给实体中的 catalogStructure则标注 如果前端需要一个原来的ID,一个label,那就需要创建一个DTO,如图所示将dictField 后边写上你想要的字段名称就行了 四备注以及扩展 这个是公司用的pigx框架没用到的同学可以跳过了仅供参考依据具体项目实际来定 参数的入值 AfterReturning(pointcut doPointcut(), returning result)public void doAfterReturning(JoinPoint pjp, Object result) {try {DictUtils.convertDict(result);} catch (Exception e) {log.error(String.valueOf(e));}} 这个代码中的result需要着重注意他可能会存在判断的问题 举例这个是正常的只拿到这个返回的实体就行在我们实现三中的方法convertDict所有if的目的都是为了拿到返回值中的实体 比如底下这个图分页返回的就需要做一个判断实现三我已经加上了这个做一个参考 判断 五具体实现 优化1多个字段的匹配用“”隔开代码优化 Component public class DictUtils {private static final String DICT_FIELD_SUFFIX Text;/*** 执行字典转换的公共方法* param target 待转换的对象*/public static void convertDict(Object target) {//判断是否是分页if (target instanceof Page) {for (Object object : ((Page?) target).getRecords()) {convertDictInternal(object);}//是否是list} else if (target instanceof List) {if (CollectionUtils.isNotEmpty((List?) target)) {for (Object object : (List?) target) {convertDictInternal(object);}}} else {convertDictInternal(target);}}/*** 内部的字典转换实现方法* param target 待转换的对象*/SneakyThrowsprivate static void convertDictInternal(Object target) {// 获取目标对象的字典定义ListDictDefinition dictDefinitions getMetadata(target);// 如果没有字典定义则直接返回if (CollectionUtils.isEmpty(dictDefinitions)) {return;}// 提取字典类型并获取字典映射String commaSeparatedString dictDefinitions.stream().map(d - d.getDict().dictType()).collect(Collectors.joining(,));ListString dictNames Arrays.asList(commaSeparatedString.split(,));MapString, MapLong, String dictMapMap getDictMap(dictNames);// 执行具体的字典转换操作doConvertDict(target, dictDefinitions, dictMapMap);}/*** 获取目标对象的字典定义* param target 目标对象* return 字典定义列表*/private static ListDictDefinition getMetadata(Object target) {ListDictDefinition dictDefinitions new ArrayList();// 排除基本类型、包装类型、Map 和 String 类型if (ClassUtils.isPrimitiveOrWrapper(target.getClass())|| target instanceof Map || target instanceof String) {return dictDefinitions;}// 获取目标对象的所有字段ListField fields FieldUtils.getAllFieldsList(target.getClass());for (Field field : fields) {// 获取字段上的 Dict 注解Dict dict AnnotationUtils.getAnnotation(field, Dict.class);if (dict! null) {// 创建并添加字典定义DictDefinition dictDefinition new DictDefinition();dictDefinition.setDict(dict);dictDefinition.setField(field);dictDefinitions.add(dictDefinition);}}return dictDefinitions;}/*** 根据字典名称获取字典映射* param dictNames 字典名称列表* return 字典映射*/SneakyThrowsprivate static MapString, MapLong, String getDictMap(ListString dictNames) {final RemoteDictService remoteDictService SpringContextHolder.getBean(RemoteDictService.class);ListSysDictItem dictList remoteDictService.getDictItemByType(dictNames);return new HashMap(dictList.stream().collect(Collectors.groupingBy(SysDictItem::getDictType, Collectors.toMap(SysDictItem::getId, SysDictItem::getLabel, (v1, v2) - v2))));}/*** 执行具体的字典字段转换* param target 目标对象* param dictDefinitions 字典定义列表* param dictMapMap 字典映射*/SneakyThrowsprivate static void doConvertDict(Object target, ListDictDefinition dictDefinitions,MapString, MapLong, String dictMapMap) {for (DictDefinition dictDefinition : dictDefinitions) {Dict dict dictDefinition.getDict();Field field dictDefinition.getField();String[] dictTypes dict.dictType().split(,);for (String dictType : dictTypes) {MapLong, String dictMap dictMapMap.get(dictType.trim());// 读取字段的字典编码String dictCode String.valueOf(FieldUtils.readField(target, field.getName(), true));// 类型转换Long longDictCode Long.valueOf(dictCode);// 确定字典字段名String dictField StringUtils.isEmpty(dict.dictField())? field.getName() DICT_FIELD_SUFFIX : dict.dictField();// 设置字段的字典文本值if (dictMap! null dictMap.containsKey(longDictCode)) {FieldUtils.writeField(target, dictField, dictMap.get(longDictCode), true);}}}}Datapublic static class DictDefinition {private Dict dict;private Field field;} } 使用方式 参考 主要内容参考 java自定义注解实现数据字典映射_字典映射 java-CSDN博客 分页扩展参考 字典翻译Dict - 莫大人 - 博客园
http://www.hkea.cn/news/14367049/

相关文章:

  • wordpress 建站完整视频教程上海债务优化公司
  • 龙岗网站建设推广上海免费建站模板
  • 做外贸 是否需要做中文网站中职专业设计网站
  • 江西省城市建设档案馆网站卓进网站
  • 怎么给网站做网页做棋牌网站抓到会怎么量刑
  • 简单个人网站制作流程国内优秀设计网站站长
  • 网站怎么企业备案手机网站在哪里找到
  • 海口百度seo公司成都优化网站
  • 扬州广陵区建设局网站广州 环保 凡人网站建设
  • 湖北seo网站多少钱龙岩平面设计
  • 宽屏网站和普通网站哪些网站容易收录
  • 网站关键字语法证件查询官网入口
  • 做电影网站需要服务器吗成都网络推广服务
  • 网站建设客户说没用手机域名注册被骗
  • 做ppt网站汽车网页模板
  • 湖南省城乡建设厅网站语言做网站
  • 快速进入网站如何开发自己的小程序
  • 网站放到服务器短链接生成二维码
  • 接项目做的网站网络黄页推广软件哪个好
  • 云南网站设计联系方式创办一个网站需要多少资金
  • 免费手机网站源码下载做实验的网站
  • 婚庆企业网站建设cookie做网站访问量
  • 荣耀手机商城官方网站荣耀60pro怎么做家政的网站
  • 响应式环保网站二维码引流推广的平台
  • 做网站怎么删除图片seo是什么职业
  • 做企业网站代码那种好怎么设置网页版浏览器
  • 优秀网站设计案例中国网站建设管理典型经验材料
  • 旅游做哪个网站好wordpress 编辑
  • 企业网站的基本类型包括苏州网站建设网
  • 支付网站建设费的会计分录照片生成视频制作软件