JAVA项目开发的整个过程项目数据字典

2 是否在职
1 2
name
北京 上海 深圳 天津
男 女
是 否
数据类型
所属单位 所属单位 所属单位 所属单位
性别 性别
是否在职 是否在职
字段: 主键ID 数据类型(keyword)
1 所属单位 2 所属单位 3 所属单位 4 所属单位 5 性别 6 性别 7 是否在职 8 是否在职
数据项编号(code) 数据项名称(name) 1 北京 2 上海 3 深圳 4 天津 1男 2女 1是 2否
2、PO对象转换成VO对象
ElecSystemDDlAction 操作:
1、获取页面传递的数据类型 2、使用数据类型查询数据字典表,获取对应数据类型的数 据项的值 3、PO对象转换成VO对象
dictionaryI
传递参数: * 1、hidden=keywordname,存 放数据类型,即数据字典keyword * 2、hidden=typeflag, 判断标识,值为new或者add * new:新建一种数据类型 * add:在已有的数据类型中进 行编辑
特点: * 在数据类型相
从1开始,按照顺序进
* 在数据类型相 从1开始,按照顺序进
* 在数据类型相 * 数据字典中, 空。
ElecSystemDDlAction
操作: 1、查询数据字典表中的数据类型,使用distinct关键
字,去掉数据类型的重复值。 2、PO对象转换成VO对象
dictionaryIn
在数据类型相同的情况下,数据项编号不能出现重复,且 开始,按照顺序进行排列
在数据类型相同的情况下,数据项的名称不能出现重复 数据字典中,数据类型、数据项编号、数据项名称不能为
dictionaryIndex.jsp
dictionaryEdit.jsp 据类型的数
dictionaryIndex.jsp
辑和修改) * 根据数据类型先删除原有的所有数据项的值 * 将获取的页面的数据字典的参数放置PO对象中 * 执行保存的操作
联系电话 88223344 12345678 23451234 12312312
是否在职 1 1 1 1
统计: * 所属单位:北京 上海 深圳 北京:2 上海:1 深圳:1 * 性别 男 女 男 3人 女 1人
主键ID 1 2 3 4
姓名 张三 李四 王五 赵六
年龄 23 22 24 25
性别 1 2 1 1
所属单位 1 2 3 1
家庭住址 北京上地三街 上海金山区 深圳华强 北京中关村
联系电话 88223344 12345678 23451234 12312312
code 所属单位
1 2 3 4 性别 1
的数据类型中 2、
* 根据数据类型,使用先删除原数据中
数据项 * 保存新的数据类型和数据项
执行保存的操作 * 3、name="itemname" type="text"
存放数据项的名称
ElecSystemDDlAction
操作: 1、获取页面的参数值 2、获取页面的typeflag (1)当typeflag=new,(new表示新建一种数据类型) * 将获取的页面的数据字典的参数放置PO对象中 * 执行保存的操作 (2)当typeflag=add,(add表示在已有的数据类型中进行
* 是否在职 在职人数 不在职人数
录入用户信息(所属单位): 使用下拉菜单形式: --请选择-北京 上海 深圳 天津
新的需求:加入“天津”分公司
优势: 1、可以动态的维护系统的基本数据项。 2、便于对系统的数据项进、是否在职。
在数据类型相同的情况下,数据项编号不能出现重复,且 开始,按照顺序进行排列
建一种数据类型) 对象中
已有的数据类型中进行编
有数据项的值 对象中
原数据:(模仿页面)
编号 名称(ddlname)
1
北京
2
上海
3
深圳
删除
现数据:(模仿页面)
编号 名称(ddlname)
1
北京
2
天津
3
深圳
4
厦门
5
郑州
删除
保存
实现: 1、 * 对编号是1,2,3的数据项的名称进行修
改 * 对编号是4,5的数据项添加到所属单位
合集下载

java开发项目的流程

java开发项目的流程

Java开发项目的流程可以分为几个主要阶段,以下是一个常见的Java项目开发流程:1.需求分析阶段:-与客户沟通:了解客户的需求和期望,明确项目的目标。

-需求调研:对项目的业务、功能和性能需求进行深入调研和分析。

-编写需求文档:撰写清晰、具体、可量化的需求文档,包括功能、性能、安全等方面的要求。

2.设计阶段:-系统架构设计:定义系统的整体结构,包括模块划分、数据流程、技术选型等。

-数据库设计:设计数据库结构,包括表的设计、关系建立等。

-详细设计:对每个模块进行详细设计,确定类、方法、接口等的设计方案。

3.实施(编码)阶段:-编码:根据设计文档进行编码,遵循编码规范,保持良好的代码质量。

-单元测试:编写单元测试用例,确保每个模块的功能正确性。

-集成测试:集成各个模块,进行整体功能测试,发现和解决集成问题。

4.测试阶段:-系统测试:对整个系统进行全面测试,验证系统是否符合需求。

-性能测试:测试系统在不同负载下的性能表现,确保系统具有足够的性能。

-安全测试:检查系统的安全性,防范潜在的安全威胁。

5.部署阶段:-部署准备:准备好系统上线所需的环境、配置信息等。

-部署:将系统部署到生产环境,并确保系统能够正常运行。

-监控与优化:设置监控系统,实时监测系统运行状态,进行性能优化。

6.维护与升级阶段:-Bug修复:及时处理用户反馈的Bug,确保系统的稳定性和可靠性。

-功能升级:根据用户需求或业务发展,对系统进行功能升级和优化。

-技术更新:定期检查和更新项目所使用的技术栈,保持系统技术水平的竞争力。

7.文档管理:-文档编写:持续更新和完善项目文档,包括用户手册、开发文档、维护文档等。

-知识分享:将项目经验进行总结和分享,促进团队的技术积累。

8.团队协作与沟通:-团队协作:保持团队成员之间的协作,定期举行会议,确保项目进度和质量。

-沟通与反馈:保持与客户、团队成员之间的良好沟通,及时处理问题和反馈。

这个流程是一个迭代的过程,需要根据项目的实际情况进行灵活调整。

一个完整的IT项目开发流程

一个完整的IT项目开发流程

一个完整的IT项目开发流程一般情况下,企业开发软件时会按照基线和定制两块并行方式执行项目开发工作。

无论什么公司,都需要遵从一套成熟的产品研发过程体系,才能做出质量较好的产品。

因此,如果出现项目较多的情况,应该合理地安排基线和定制之前的里程碑,让基线产品能够尽量多地收集用户的通用型需求,为定制项目进度实现技术支撑,减少定制项目中大量更改代码、需要新增模块情况发生。

此外,产品研发过程体系也需要按照业务实际时间要求变化,不要拘泥于一定要按照瀑布方式,或是敏捷方式进行管理,凡事都需要找到契合自己的方式。

【这里以一个基线产品开发过程作为流程解释基础,需要注意的是,以下说描述的各个阶段,在项目执行前要明确各个阶段的目标、指定计划、及时沟通,并确保各个时期所有成员对项目理解一致】软件开发流程步骤:项目启动、需求分析、概要设计、详细设计、编码、测试、软件交付、验收、维护。

项目启动会项目启动会的目标是明确该产品开发项目的目标。

目标不是孤立存在的,目标与计划相辅相成,目标指导计划,计划的有效性影响着目标的达成。

所以在执行目标的时候,考虑清楚自己的行动计划,怎么做才能更有效地完成目标,是每个人都要详情清楚的问题,否则,目标越是不清晰或是过高,都会影响项目的实际结果。

项目启动会需要说明项目目标、阶段划分、组织结构、管理流程等关键事项,并将这些内容写入PPT(最好是有固定格式和范文,让团队内部或者公司内部共同遵守规范),需要大家达成一致。

对于关键角色任命,事前也需要听取相关领导和项目主要干系人的意见。

用户需求软件开始开发前需要确定代价和所获得价值的对比,也就是ROI(Return On investment),一旦确定需要创建,就需要安排一系列的资源来支撑这个软件的生存。

这是需求的最原始描述。

为什么既要有用户需求,也要有产品需求?因为两者是有差异的,用户需求由用户提出,对技术一般不描述,只描述产品目标。

产品需求是根据用户需求转化而来的技术实现需求,需要针对用户提出的产品目标进行细分,总结出具体的每一个功能点,再针对每一个功能点细分为各种不同的操作流程,对每一个操作流程进行技术化定义。

数据字典描述

数据字典描述

数据字典描述一、引言数据字典是一个关于数据元素的集合,它提供了对数据元素的定义、属性和关系的详细描述。

本文档旨在描述数据字典的标准格式,以便统一数据字典的编写规范,提高数据管理的效率和准确性。

二、数据字典结构数据字典通常由以下几个部分组成:1. 数据元素名称:描述数据元素的名称,应该简明扼要,具有一定的描述性。

2. 数据类型:指定数据元素的类型,例如整数、字符串、日期等。

3. 长度:指定数据元素的长度,以字符为单位。

4. 精度:对于数值型数据元素,指定其精度和小数位数。

5. 可空性:指定数据元素是否允许为空值。

6. 默认值:指定数据元素的默认值,当数据元素为空时使用。

7. 描述:对数据元素进行详细的描述,包括其含义、用途、取值范围等。

8. 约束条件:指定数据元素的约束条件,例如唯一性约束、范围约束等。

9. 关系:描述数据元素与其他数据元素之间的关系,例如主键-外键关系。

三、示例数据字典下面是一个示例数据字典,用于描述一个学生信息表的数据元素:1. 数据元素名称:学生编号数据类型:整数长度:10精度:N/A可空性:否默认值:N/A描述:学生的唯一标识符,用于区分不同的学生。

约束条件:唯一性约束2. 数据元素名称:学生姓名数据类型:字符串长度:50精度:N/A可空性:否默认值:N/A描述:学生的姓名,用于显示和识别学生。

约束条件:N/A3. 数据元素名称:性别数据类型:字符串长度:1精度:N/A可空性:否默认值:N/A描述:学生的性别,可以是男性或女性。

约束条件:N/A4. 数据元素名称:出生日期数据类型:日期长度:N/A精度:N/A可空性:否默认值:N/A描述:学生的出生日期,用于计算年龄和日期相关的操作。

约束条件:N/A5. 数据元素名称:班级编号数据类型:整数长度:10精度:N/A可空性:是默认值:N/A描述:学生所属的班级编号,用于与班级表建立关联。

约束条件:外键约束,关联班级表的班级编号字段。

java开发中使用枚举表述数据字典

java开发中使用枚举表述数据字典

java开发中使⽤枚举表述数据字典⼀.⽤枚举表述数据字典1.代码:package com.inspire.jdk.caculate;/*** Created by yaming* ⽤枚举表述常量数据字段*/public enum StateEnum { //使⽤构造⽅法创建对象,每⼀个都是StateEnum的实例SUCCESS(1, "成功"),FAILED(0, "失败");private int state;private String stateInfo;public int getState() {return state;}public String getStateInfo() {return stateInfo;}StateEnum(int state, String stateInfo){this.state = state;this.stateInfo = stateInfo;}/*** 根据int类型的index,找到对应StateEnum* @param index* @return*/public static StateEnum stateOf(int index){for (StateEnum state:values()){if (state.getState()==index){return state;}}return null;}/*** 根据int类型的index,找到对应的String的值* @param index* @return*/public static String valuesOf(int index){for (StateEnum state:values()){if (state.getState()==index){return state.getStateInfo();}}return "null";}}2.java中的枚举类(enum)和java中的普通类(class)⼀样,只是预先定义了⼀系列的⽰例变量如:public enum Color {// 每个变量都是 Color 的⼀个⽰例RED, YELLOW, BLUE;} 2.1 所以枚举内部直接就可以书写⽰例变量,如RED,YELLOW,BLUE. 2.2 枚举有⼀些⾃然获得的成员⽅法,Color.values()⽅法 2.3 枚举类和普通类相似的⼀个依据就是,枚举也可以含有构造函数3.总结:枚举限制住了该类型的实例变量的个数和可能性,因为⼀个枚举的实例变量在定义该枚举时就确定了。

java 数据字典表拆解

java 数据字典表拆解

java 数据字典表拆解
Java中的数据字典表是一种基于键值对的数据结构,用于存储和管理数据。

它由一系列的键(Key)和对应的值(Value)组成。

拆解含义:
1.数据:指需要存储和管理的信息。

2.字典表:指以键值对形式存储数据的数据结构。

特点:
1. 键值对存储:数据字典表使用键值对的方式进行数据存储,通过唯一的键来索引对应的值,实现高效的数据访问。

2. 高效性能:数据字典表在插入、删除、查找等操作上具有较高的性能,由于采用哈希表或搜索树等底层实现方式,可以快速定位到需要的数据。

3. 灵活性:数据字典表可以存储不同类型的数据,键和值可以是任意对象,使其适用于各种场景。

4. 易于扩展:数据字典表支持动态添加和删除键值对,使其具有良好的扩展性,能够满足不同需求下的数据管理。

作用:
1. 存储配置信息:数据字典表可以用来存储系统的配置信息,例如数据库连接参数、缓存配置等,方便统一管理和修改。

2. 缓存数据:数据字典表可以用来缓存频繁读取的数据,提高系统响应速度和性能。

3. 数据索引:通过合理设计数据字典表,可以实现数据的快速检索和查询,提高数据访问效率。

4. 数据传递:数据字典表可以作为数据的中间传递格式,方便不同模块或系统之间的数据交互和共享。

总之,数据字典表在Java中是一种灵活、高效的数据结构,可以用于存储和管理各种类型的数据,广泛应用于系统开发和数据处理领域。

java设计数据字典_应用开发中数据字典项设计实现方案

java设计数据字典_应用开发中数据字典项设计实现方案

java设计数据字典_应⽤开发中数据字典项设计实现⽅案应⽤开发中项设计实现⽅案在 应⽤开发中,总会遇到许多数据字典项,⽐如对象状态、对象类型等等,这些项⼀般都是固定的若⼲可选值选项,⽐如对象状态可能有新建、修改、删除等状态,这 些数据字典项⼀旦定义完毕改动的频率⾮常低;在应⽤开发中,为了处理⽅便,⼀般要对这些数据字典项值选项进⾏数字编码(例如:0表⽰新建,1表⽰修改,2表⽰删除等),以⽅便应⽤程序中使⽤。

⽽UI显⽰对象信息时不能显⽰对象状态等的编码,对于编码值设计⼈员知道代表什么意思,但⽤户就不明⽩了,所以需要进⾏编码转换,从编码转换为⽂字描述(名称),也就是需要把状态编码0转换为“新建”,把1转换为“修改”,把2转换为“删除”等显⽰给⽤户,⽤户才明⽩对象当前的状态是什么。

下⾯介绍⼀下常⽤的实现⽅法:实现⽅案:⼀、在java⽂件中定义数据字典项我们习惯上把应⽤中遇到的数据字典项都定义到⼀个java⽂件中,这是最常⽤的⽅法,实现起来⽐较简单,但维护起来就⾮常繁琐,特别是数据字典项⽐较多的情况下,相应的java⽂件就会⽐较⼤,⼀旦数据字典项有更新那么维护起来就⽐较费时费⼒。

在java⽂件中定义数据字典项通常情况下定义为static,举例来说,类ReportConstants中定义了以下数据字典项:public static final int CODE_USERINF_TECHELEVEL_GJ = 1;public static final String CODE_USERINF_TECHELEVEL_GJ_KEY = "⾼级";public static final int CODE_USERINF_TECHELEVEL_ZJ = 2;public static final String CODE_USERINF_TECHELEVEL_ZJ_KEY = "中级";public static final int CODE_USERINF_TECHELEVEL_CJ = 3;public static final String CODE_USERINF_TECHELEVEL_CJ_KEY = "初级";public static final int CODE_USERINF_TECHELEVEL_WJ = 4;public static final String CODE_USERINF_TECHELEVEL_WJ_KEY = "⽆职称";那么我们在实现中就可以直接引⽤相应的数据字典项编码及名称,另外,⼀般情况下需要定义数据字典项编码和名称的转换⽅法,⽐如:public static String getCodeName(int lCode){//初始化返回值String strReturn = "未知";switch (lCode){case CODE_USERINF_TECHELEVEL_GJ :strReturn = CODE_USERINF_TECHELEVEL_GJ_KEY;break;case CODE_USERINF_TECHELEVEL_ZJ :strReturn = CODE_USERINF_TECHELEVEL_ZJ_KEY;break;case CODE_USERINF_TECHELEVEL_CJ :strReturn = CODE_USERINF_TECHELEVEL_CJ_KEY;break;case CODE_USERINF_TECHELEVEL_WJ :strReturn = CODE_USERINF_TECHELEVEL_WJ_KEY;break;}return strReturn;}这个⽅法实现了通过数据字典项编码获得数据字典项名称的功能。

(完整word版)系统开发流程

系统开发为了保障软件系统按质按时完成,在系统设计和开发时严格遵守软件工程和CMM2级软件过程管理的规范,采用瀑布模型的形式进行项目开发,并制定了如下图表示的工作流程。

每个阶段都有一个评审。

每个评审都是对该阶段工作的检查,只有通过了评审才能进入下一个阶段。

通过严格的评审,可以有效的保证系统开发的进度和质量。

系统开发的流程如图所示,它详细描述了开发过程中各阶段的顺序。

系统实现图6-9 系统开发流程(1)开发计划根据用户对系统功能的要求和业务管理的需要,在充分分析当前省级界线信息管理系统开发和设计的技术与平台的基础上,确定本系统的技术方案和开发计划,为系统的建设和实施提供一个基本的概要方案,保证系统的功能满足应用的需求。

在系统实施初期,要对系统的功能进行基本的了解和分析,制定完善的系统设计方案,并对系统应用的各项软件和硬件平台进行分析和设计,提供合理的平台选型方案,以及系统实现的技术方案,做好系统开发和实施的技术攻关,确定系统开发的可行性。

(2)系统调研与需求分析调研考察与用户需求分析是系统设计成功的关键,这个过程就是客户将系统要完成的工作描述给系统设计者;另外,客户的业务流程要描述给系统设计者。

系统设计者要把客户的思想领悟过来,领悟的多少基本决定系统的成功与否,因为理解了客户的思想才能分析客户的思想;哪些在现实条件或技术上是合理的;哪些功能计算机不可能实现;哪些功能应变通实现。

并从客户角度为客户建议应增加哪些功能;从技术角度为客户提高系统的档次。

总之,客户与系统设计者要充分交流思想,最后要达成一致。

本系统建设由开发人员与民政部技术人员共同交流,协同进行系统的调研工作,并由系统开发人员对系统需求调研结果进行综合分析,确定数据结构、系统的功能及其实现方式。

系统调研完成后,将由系统开发人员对调研结果进行分析,并形成完善的《系统需求调研分析报告》,它是今后系统设计和实施的纲领,是系统建设的基础和保障,是相互在后期工作中的根本标准。

项目开发—项目开发流程8个步骤

项⽬开发—项⽬开发流程8个步骤以下是项⽬开发流程的⼋个步骤:1、项⽬开发⽬的分析与确定软件开发流程的这⼀阶段,主要是在软件开发商将开发项⽬确定下来之后,需要与需求⽅进⾏讨论,确定需求⽅对于软件开发需要实现的⽬标及其具体需要的功能等等,并确定是否可达成。

2、需求分析这是软件开发流程的第⼆个阶段,也是为软件开发的正常进⾏确定具体思路的阶段。

在确定软件开发可进⾏后,必须要对客户需要实现的软件功能需求进⾏具体详细的分析。

同时应当考虑在开发过程中可能出现的变化情况,制定需求变更计划随时应对特殊情况的发⽣,保证软件开发流程的顺畅进⾏。

3、设计软件设计要根据上⼀阶段对软件功能需求分析的结果,来设计软件系统的框架结构、功能模块和数据库等等。

分为总体设计和详细设计两个部分,4、编程软件开发流程中每上⼀个阶段都是下⼀个阶段的实施进⾏的基础。

编程也是根据对软件设计,将软件设计的各部分需求通计算机程序代码来实现运⾏,编程有统⼀、规范的程序编写规则,保证软件程序的易懂性、易维护性。

5、软件测试在根据设计将客户软件需⽤编程代码来实现之后,也就是软件程序完成之后,需要对编写的程序,形成整体构架、功能进⾏单元、组装、系统三阶段的测试,以测试程序编写的正确性,以及对客户需求功能满⾜的充分性,以此来确定软件是否达到开发要求,同时也是⼀个发现问题、纠正问题的过程。

6、软件交付软件开发流程通过以上核⼼环节完成了软件开发,接下来就是在软件开发达到客户需求之后,开发者将软件系统交予客户,并将软件安装程序、数据库的数据字典、《⽤户安装⼿册》、《⽤户使⽤指南》、需求报告、设计报告、测试报告等产物交付给客户;同时指导客户进⾏软件安装、以及安装技巧,提醒客户注意软件运⾏状况、环境、服务器及相关中间件的检测与注意事项,知道客户软件的实际操作⽅法、使⽤流程等等问题,实现合同规定任务。

7、验收⽤户在接收开发商交付的软件开发结果,并进⾏实际操作、测试运⾏,实现满意结果之后,对开发出来的软件进⾏验收。

SpringBoot中实现数据字典的示例代码

SpringBoot中实现数据字典的⽰例代码我们在⽇常的项⽬开发中,对于数据字典肯定不模糊,它帮助了我们更加⽅便快捷地进⾏开发,下⾯⼀起来看看在 SpringBoot 中如何实现数据字典功能的⼀、简介1、定义数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进⾏定义和描述,其⽬的是对数据流程图中的各个元素做出详细的说明,使⽤数据字典为简单的建模项⽬。

简⽽⾔之,数据字典是描述数据的信息集合,是对系统中使⽤的所有数据元素的定义的集合。

数据字典(Data dictionary)是⼀种⽤户可以访问的记录数据库和应⽤程序元数据的⽬录。

主动数据字典是指在对数据库或应⽤程序结构进⾏修改时,其内容可以由DBMS⾃动更新的数据字典。

被动数据字典是指修改时必须⼿⼯更新其内容的数据字典。

2、理解数据字典是⼀种通⽤的程序设计思想,将主体与分⽀存于两张数据表中,他们之间靠着唯⼀的 code 相互联系,且 code 是唯⼀存在的,分⽀依附主体⽽存在,每⼀条分⽀都有它唯⼀对应的属性值例如:性别(sex),分为(0–保密1–男2–⼥),那么数据字典的设计就应该是主表:{"code": "sex","name": "性别"}副表:[{"dictCode": "sex","code": "0","text": "保密"},{"dictCode": "sex","code": "1","text": "男"},{"dictCode": "sex","code": "2","text": "⼥"}]那么我们在使⽤数据字典的时候,只需要知道 dictCode,再使⽤ code 找到唯⼀的字典值⼆、数据表设计1、数据表设计主表:drop table if exists sys_dict;/*==============================================================*//* Table: sys_dict *//*==============================================================*/create table sys_dict(id bigint(20) not null auto_increment comment '主键id',code varchar(32) comment '编码',name varchar(32) comment '名称',descript varchar(64) comment '描述',status tinyint(1) default 0 comment '状态(0--正常1--冻结)',create_time datetime comment '创建时间',create_user bigint(20) comment '创建⼈',del_flag tinyint(1) default 0 comment '删除状态(0,正常,1已删除)',primary key (id))type = InnoDB;alter table sys_dict comment '字典管理表';副表:drop table if exists sys_dict_detail;/*==============================================================*//* Table: sys_dict_detail *//*==============================================================*/create table sys_dict_detail(id bigint(20) not null comment '主键id',dict_code varchar(32) comment '字典编码',code varchar(32) comment '编码',name varchar(32) comment '名称',primary key (id))type = InnoDB;alter table sys_dict_detail comment '字典配置表';它们的关系如图所⽰:2、数据字典配置三、开发前戏1、引⼊ maven 依赖<!-- web⽀持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- thymeleaf模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- aop依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- lombok插件 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>我们引⼊了 aop 切⾯所需依赖,我们的数据字典也是基于 aop 切⾯实现的2、创建实体类⽤户信息表 SysUserInfo.java:import com.baomidou.mybatisplus.annotation.*;import com.baomidou.mybatisplus.extension.activerecord.Model;import mon.annotation.Dict;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.EqualsAndHashCode;import lombok.experimental.Accessors;import java.io.Serializable;/*** <p>* ⽤户信息表* </p>** @author lizhou* @since 2020-07-06*/@Data@EqualsAndHashCode(callSuper = false)@Accessors(chain = true)@TableName("sys_user_info")@ApiModel(value="SysUserInfo对象", description="⽤户信息表")public class SysUserInfo extends Model<SysUserInfo> {@ApiModelProperty(value = "ID")@TableId(value = "id", type = IdType.AUTO)private Long id;@ApiModelProperty(value = "登录账号")@TableField("account")private String account;@ApiModelProperty(value = "登录密码")@TableField("password")private String password;@ApiModelProperty(value = "姓名")@TableField("name")private String name;@ApiModelProperty(value = "性别(0--未知1--男2--⼥)")@TableField("sex")@Dict(dictCode = "sex")private Integer sex;@ApiModelProperty(value = "状态(0--正常1--冻结)")@TableField("status")@Dict(dictCode = "status")private Integer status;}3、返回结果通⽤实体类返回结果通⽤实体类 LayTableResult.java:import lombok.Getter;import lombok.Setter;import java.util.List;/*** @param <T> 返回的实体类* @author lizhou* @描述后台返回给LayUI的数据格式*/@Getter@Setterpublic class LayTableResult<T> {/*** 接⼝状态*/private Integer code;/*** 提⽰信息*/private String msg;/*** 接⼝数据长度*/private Long count;/*** 接⼝数据*/private List<T> data;/*** ⽆参构造函数*/public LayTableResult() {super();}/*** 返回数据给表格*/public LayTableResult(Long count, List<T> data) {super();this.count = count;this.data = data;this.code = 0;}}由于我⽤的是 layui 前端框架,我写了⼀个返给 layui 表格的通⽤实体类,这是在实现数据字典需要⽤到的,判断响应返回实体类的类型来判断是否需要注⼊字典四、开发实现1、创建⾃定义注解我们创建⼀个⾃定义注解 @Dict 来实现数据字典import ng.annotation.ElementType;import ng.annotation.Retention;import ng.annotation.RetentionPolicy;import ng.annotation.Target;/*** 数据字典注解** @author Tellsea* @date 2020/6/23*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Dict {/*** 字典类型** @return*/String dictCode();/*** 返回属性名** @return*/String dictText() default "";}2、注解实现我们使⽤ aop 切⾯来实现什么的⾃定义注解 @Dictimport com.alibaba.fastjson.JSONObject;import com.fasterxml.jackson.annotation.JsonFormat;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import mon.annotation.Dict;import yTableResult;import mon.utils.ObjConvertUtils;import com.zyxx.sbm.entity.SysDictDetail;import com.zyxx.sbm.service.SysDictService;import lombok.extern.slf4j.Slf4j;import ng3.StringUtils;import ng.ProceedingJoinPoint;import ng.annotation.Around;import ng.annotation.Aspect;import ng.annotation.Pointcut;import org.springframework.beans.factory.annotation.Autowired;import ponent;import ng.reflect.Field;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;/*** 数据字典切⾯** @author Tellsea* @date 2020/6/23*/@Aspect@Component@Slf4jpublic class DictAspect {/*** 字典后缀*/private static String DICT_TEXT_SUFFIX = "Text";@Autowiredprivate SysDictService sysDictService;/*** 切点,切⼊ controller 包下⾯的所有⽅法*/@Pointcut("execution( * com.zyxx.*.controller.*.*(..))")public void dict() {}@Around("dict()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {long time1 = System.currentTimeMillis();Object result = pjp.proceed();long time2 = System.currentTimeMillis();log.debug("获取JSON数据耗时:" + (time2 - time1) + "ms");long start = System.currentTimeMillis();this.parseDictText(result);long end = System.currentTimeMillis();log.debug("解析注⼊JSON数据耗时" + (end - start) + "ms");return result;}private void parseDictText(Object result) {if (result instanceof LayTableResult) {List<JSONObject> items = new ArrayList<>();LayTableResult rr = (LayTableResult) result;if (rr.getCount() > 0) {List<?> list = (List<?>) rr.getData();for (Object record : list) {ObjectMapper mapper = new ObjectMapper();String json = "{}";try {// 解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormatjson = mapper.writeValueAsString(record);} catch (JsonProcessingException e) {log.error("Json解析失败:" + e);}JSONObject item = JSONObject.parseObject(json);// 解决继承实体字段⽆法翻译问题for (Field field : ObjConvertUtils.getAllFields(record)) {//解决继承实体字段⽆法翻译问题// 如果该属性上⾯有@Dict注解,则进⾏翻译if (field.getAnnotation(Dict.class) != null) {// 拿到注解的dictDataSource属性的值String dictType = field.getAnnotation(Dict.class).dictCode();// 拿到注解的dictText属性的值String text = field.getAnnotation(Dict.class).dictText();//获取当前带翻译的值String key = String.valueOf(item.get(field.getName()));//翻译字典值对应的text值String textValue = translateDictValue(dictType, key);// DICT_TEXT_SUFFIX的值为,是默认值:// public static final String DICT_TEXT_SUFFIX = "_dictText";log.debug("字典Val: " + textValue);log.debug("翻译字典字段:" + field.getName() + DICT_TEXT_SUFFIX + ": " + textValue); //如果给了⽂本名if (!StringUtils.isBlank(text)) {item.put(text, textValue);} else {// ⾛默认策略item.put(field.getName() + DICT_TEXT_SUFFIX, textValue);}}// date类型默认转换string格式化⽇期if ("java.util.Date".equals(field.getType().getName())&& field.getAnnotation(JsonFormat.class) == null&& item.get(field.getName()) != null) {SimpleDateFormat aDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));}}items.add(item);}rr.setData(items);}}}/*** 翻译字典⽂本** @param dictType* @param key* @return*/private String translateDictValue(String dictType, String key) {if (ObjConvertUtils.isEmpty(key)) {return null;}StringBuffer textValue = new StringBuffer();String[] keys = key.split(",");for (String k : keys) {if (k.trim().length() == 0) {continue;}/*** 根据 dictCode 和 code 查询字典值,例如:dictCode:sex,code:1,返回:男* 应该放在redis,提⾼响应速度*/SysDictDetail dictData = sysDictService.getDictDataByTypeAndValue(dictType, key);if (dictData.getName() != null) {if (!"".equals(textValue.toString())) {textValue.append(",");}textValue.append(dictData.getName());}("数据字典翻译: 字典类型:{},当前翻译值:{},翻译结果:{}", dictType, k.trim(), dictData.getName());}return textValue.toString();}}3、注解使⽤我们只需要在实体类的属性上加⼊我们实现的⾃定义注解即可@ApiModelProperty(value = "性别(0--未知1--男2--⼥)")@TableField("sex")@Dict(dictCode = "sex")private Integer sex;@ApiModelProperty(value = "状态(0--正常1--冻结)")@TableField("status")@Dict(dictCode = "status")private Integer status;我们对 sex,status 都加⼊了 @Dict(dictCode = “”) 注解,那么我们在获取⽤户信息的时候,就能获取到对应的字典值了五、测试1、编写 API 查询我们在 controller 层开放⼀个 API 实现查询⽤户列表/*** 分页查询*/@PostMapping("list")@ResponseBodypublic LayTableResult list(Integer page, Integer limit, SysUserInfo userInfo) {QueryWrapper<SysUserInfo> queryWrapper = new QueryWrapper<>();if (StringUtils.isNotBlank(userInfo.getName())) {queryWrapper.like("name", userInfo.getName());}if (null != userInfo.getSex()) {queryWrapper.eq("sex", userInfo.getSex());}if (null != userInfo.getStatus()) {queryWrapper.eq("status", userInfo.getStatus());}queryWrapper.orderByDesc("create_time");IPage<SysUserInfo> iPage = sysUserInfoService.page(new Page<>(page, limit), queryWrapper);return new LayTableResult<>(iPage.getTotal(), iPage.getRecords());}注意:这⾥我们使⽤了 LayTableResult 作为相应实体类,与上⾯我们编写的返回通⽤实体类是⼀致的,必须⼀直,才能实现数据字典功能2、调⽤ API返回结果如下:{"code": 0,"msg": null,"count": 3,"data": [{"id": 2,"account": "152********","name": "周杰伦","sex": 1,"sexText": "男","status": 0,"statusText": "正常"}, {"id": 1,"name": "超级管理员","account": "152********","sex": 1,"sexText": "男","status": 0,"statusText": "正常"}]}可以看出,返回的数据中,多出了 sexText,statusText,两个属性,也就证明我们的字典功能已经实现成功六、总结1、优点1、在⼀定程度上,通过系统维护⼈员即可改变系统的⾏为(功能),不需要开发⼈员的介⼊。

数据字典配置流程

数据字典配置流程
数据字典配置流程主要包含以下步骤:
1. 需求分析:明确系统中涉及的所有数据元素及其属性,确定需要纳入数据字典的内容。

2. 设计数据项:定义数据元素的基本信息,包括数据项名称、数据类型、长度、是否允许为空、取值范围、含义解释等。

3. 构建数据结构:设计数据表结构,定义表名、主键、外键以及各字段之间的关系,并记录在数据字典中。

4. 配置数据流:梳理数据在系统间的流动情况,记录数据源、数据目的地及数据加工过程。

5. 建立实体关系:建立实体间的关系模型,描述实体(表)之间的关联方式和约束条件。

6. 文档编写与维护:整理成文档形式的数据字典,确保其完整性和准确性,并随着系统迭代更新持续维护。

7. 审核与批准:经过相关技术人员和业务人员审核确认,确保
数据字典符合实际业务需求和系统设计标准。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档