一个车票销售系统:
要求对每个用户的每一个页面的每一个操作进行权限管理
比如有以下环境(我自己想的)
------------------------
比如有以下角色
汽车操作员
火车操作员
财务员
管理员有以下模块
汽车票
火车票
财务
管理比如有以下用户
小夏 --> 操作员
小唐 --> 汽车票操作员
小宋 --> 火车票操作员
小元 --> 账务员
小明 --> 管理员然后有以下面面
bus/AddTicket.aspx 汽车下单
bus/EditTicket.aspx 汽车单修改与删除
bus/ListTicket.aspx 汽车下单列表
train/AddTicket.aspx 火车下单
train/EditTicket.aspx 火车单修改与删除
train/ListTicket.aspx 火车下单列表
Finance/Audit.aspx 财务对账
manage/Set.aspx 车票修改与其他设置然后给
汽车模块设置权限
汽车查看 1
汽车下单 1
汽车修改 1
汽车删除 0
火车查看 0
火车下单 0
火车修改 0
火车删除 0
财务对账 0
管理设置 0火车模块设置权限
汽车查看 0
汽车下单 0
汽车修改 0
汽车删除 0
火车查看 1
火车下单 1
火车修改 1
火车删除 0
财务对账 0
管理设置 0财务模块设置权限
汽车查看 0
汽车下单 0
汽车修改 0
汽车删除 0
火车查看 0
火车下单 0
火车修改 0
火车删除 0
财务对账 1
管理设置 0管理模块设置权限
汽车查看 1
汽车下单 1
汽车修改 1
汽车删除 1
火车查看 1
火车下单 1
火车修改 1
火车删除 1
财务对账 0
管理设置 1因为上面小夏为"操作员" 那就让他拥有两个模块角色“汽车|火车操作员”
基他的也相应设置条自的权限
-------------------------
然后比如我现在是小唐登录系统因为他只有“汽车票操作员”这个模块
当他登录的时候比如链接进“火车票管理系统”的时候系统就会判断出他不是这一块的就提示权限不足退出
但当他进入bus/EditTicket.aspx(汽车单修改与删除)页面时,因为他可以正常删除,但当点击删除的时候提示权限不足不执行操作像我上面这样设置对不对;
还有数据库具体要怎么来设计谢谢
要求对每个用户的每一个页面的每一个操作进行权限管理
比如有以下环境(我自己想的)
------------------------
比如有以下角色
汽车操作员
火车操作员
财务员
管理员有以下模块
汽车票
火车票
财务
管理比如有以下用户
小夏 --> 操作员
小唐 --> 汽车票操作员
小宋 --> 火车票操作员
小元 --> 账务员
小明 --> 管理员然后有以下面面
bus/AddTicket.aspx 汽车下单
bus/EditTicket.aspx 汽车单修改与删除
bus/ListTicket.aspx 汽车下单列表
train/AddTicket.aspx 火车下单
train/EditTicket.aspx 火车单修改与删除
train/ListTicket.aspx 火车下单列表
Finance/Audit.aspx 财务对账
manage/Set.aspx 车票修改与其他设置然后给
汽车模块设置权限
汽车查看 1
汽车下单 1
汽车修改 1
汽车删除 0
火车查看 0
火车下单 0
火车修改 0
火车删除 0
财务对账 0
管理设置 0火车模块设置权限
汽车查看 0
汽车下单 0
汽车修改 0
汽车删除 0
火车查看 1
火车下单 1
火车修改 1
火车删除 0
财务对账 0
管理设置 0财务模块设置权限
汽车查看 0
汽车下单 0
汽车修改 0
汽车删除 0
火车查看 0
火车下单 0
火车修改 0
火车删除 0
财务对账 1
管理设置 0管理模块设置权限
汽车查看 1
汽车下单 1
汽车修改 1
汽车删除 1
火车查看 1
火车下单 1
火车修改 1
火车删除 1
财务对账 0
管理设置 1因为上面小夏为"操作员" 那就让他拥有两个模块角色“汽车|火车操作员”
基他的也相应设置条自的权限
-------------------------
然后比如我现在是小唐登录系统因为他只有“汽车票操作员”这个模块
当他登录的时候比如链接进“火车票管理系统”的时候系统就会判断出他不是这一块的就提示权限不足退出
但当他进入bus/EditTicket.aspx(汽车单修改与删除)页面时,因为他可以正常删除,但当点击删除的时候提示权限不足不执行操作像我上面这样设置对不对;
还有数据库具体要怎么来设计谢谢
改为
但当他进入bus/EditTicket.aspx(汽车单修改与删除)页面时,因为他可以正常修改,但当点击删除的时候提示权限不足不执行操作
http://www.cnblogs.com/Roping/archive/2007/02/13/649161.html这个项目采用分层的方式进行组织开发,但是分层不够彻底!看他的项目组织方式可以看出他是WEB表示层(WEB)和应用层(core)两层的,Core这个工程其实应该再分不同工程,以便在部署的时候,可以对不同的DLL进行引用!1. DTO这个文件夹单分出来,作为不同层(物理也好。,罗辑也好)的传输对象,独立于不同的项目文件,最好让每个DTO对象继承一个抽象类,这样在做多态,注入,WBS等进行反射的时候可以节省很多代码(可以这里没有这样做)!2. Domain这层是NHibernate的域模型层!主要采用hbm配置文件的方式实现对象的数据库映射关联!注意hbm文件采用潜入式资源的方式进行编译!这层代码基本上可以不用手写,呵呵,包括上面介绍的DTO也用手写,大家可以采用CodeSmith等工具进行生成,NHibernate本身也提供这样的工具NHibernate.Tool.hbm2net,我个人喜欢MyGeneration!3. Service,这层就是我们通常讲的业务逻辑层,对于对象的CRUD操作都是在这层进行逻辑验证分类等,这里面的逻辑一般集中在业务领域逻辑,设计到数据层业务逻辑象数据表级联删除更新等逻辑在Domain配置文件已经做好,字段长度格式等验证我们已经在WEB做了验证!这个也符合我们通常做法!4. NHHelper,这层是我们通常说说的数据访问层,对NB提供的对象持久化功能进行封装,实现对不同数据库的透明支持!同时也实现对NH中数据访问对象的Cache策略!5. Util,这个项目镇的应该单独分出来,看项目名字你就知道了,提供常用的功能类!
这个项目我把它改写了下,引用最新的NHibernate的版本号是1.2.0.2003!
分别对每一个字符设定为某一操作的权限,1为有权限,0为无权限
登录后将该字段的值存储在一session中,后续进行每一操作都先判断该操作所对应的字符是否为1
你这样的话。要是只对用户区分的话还可以
但我现在是
要用户选择相应的模块
模块里面设置相应的操作
关键在于角色权限表.
如果操作不多,写以将它写死.如
角色id,对象id(页面的地址或关键字) , 访问权限,查看权限.新增,修改,删除,..........
1 AddTicket.aspx 1 1 0 0 0 等等,如果操作权限较复杂
可来个对象自定义,一个对象就是一个页面.
然后加一个对象权限表如
对象ID 名称
1 AddTicket
对象操作权限表
对象id 操作权限
1 Add
1 Edit
1 Delete
1 View
...............
USE [GaoMai]
GO
/****** 对象: Table [dbo].[TB_ActionType] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_ActionType](
[ActionTypeID] [smallint] IDENTITY(1,1) NOT NULL,
[ActionName] [nvarchar](10) NOT NULL,
[ActionRe] [nvarchar](100) NULL,
CONSTRAINT [TB_ActionType_PK] PRIMARY KEY CLUSTERED
(
[ActionTypeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
/****** 对象: Table [dbo].[TB_FunctionAction] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TB_FunctionAction](
[FAID] [int] IDENTITY(1,1) NOT NULL,
[ActionTypeID] [smallint] NOT NULL,
[FunID] [varchar](50) NULL,
CONSTRAINT [TB_FunctionAction_PK] PRIMARY KEY CLUSTERED
(
[FAID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
/****** 对象: Table [dbo].[TB_SysFunctions] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TB_SysFunctions](
[FunID] [varchar](50) NOT NULL,
[FunName] [nvarchar](100) NOT NULL,
[ParentID] [varchar](50) NULL,
[PagePath] [nvarchar](200) NULL,
[IsMenu] [smallint] NULL,
[Re] [nvarchar](100) NULL,
CONSTRAINT [TB_SysFunctions_PK] PRIMARY KEY CLUSTERED
(
[FunID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
/****** 对象: Table [dbo].[TB_SysRole] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_SysRole](
[RoleID] [int] IDENTITY(1,1) NOT NULL,
[RoleName] [nvarchar](50) NOT NULL,
[Re] [nvarchar](100) NULL,
[IsEnabled] [smallint] NOT NULL,
[UserID] [int] NULL,
CONSTRAINT [TB_SysRole_PK] PRIMARY KEY CLUSTERED
(
[RoleID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
/****** 对象: Table [dbo].[TB_SysRoleList] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TB_SysRoleList](
[RoleListID] [int] IDENTITY(1,1) NOT NULL,
[RoleID] [int] NOT NULL,
[FunID] [varchar](50) NULL,
[Re] [nvarchar](100) NULL,
CONSTRAINT [TB_SysRoleList_PK] PRIMARY KEY CLUSTERED
(
[RoleListID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
/****** 对象: Table [dbo].[TB_UserRoles] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_UserRoles](
[UserRolesID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[RoleID] [int] NOT NULL,
[Re] [nvarchar](50) NULL,
CONSTRAINT [TB_UserRoles_PK] PRIMARY KEY CLUSTERED
(
[UserRolesID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
/****** 对象: Table [dbo].[TB_Users] 脚本日期: 03/23/2007 15:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TB_Users](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserCode] [nvarchar](50) NOT NULL,
[TrueName] [nvarchar](20) NOT NULL,
[Sex] [smallint] NOT NULL,
[DepID] [smallint] NOT NULL,
[DutyID] [smallint] NOT NULL,
[GradeID] [int] NOT NULL,
[IDCard] [varchar](20) NOT NULL,
[CTel] [nvarchar](50) NULL,
[Mobile] [nvarchar](50) NULL,
[Address] [nvarchar](200) NULL,
[FamilyTel] [nvarchar](50) NULL,
[Email] [nvarchar](50) NULL,
[MSN] [nvarchar](50) NULL,
[QQ] [varchar](10) NULL,
[BirthDay] [smalldatetime] NOT NULL,
[UrgentUser] [nvarchar](50) NULL,
[UgUserContact] [nvarchar](200) NULL,
[JoinDate] [smalldatetime] NOT NULL,
[ContractEnd] [smalldatetime] NOT NULL,
[LeaveDate] [smalldatetime] NULL,
[LoginID] [nvarchar](20) NOT NULL,
[LoginPassword] [nvarchar](64) NOT NULL,
[UserLoginState] [smallint] NULL CONSTRAINT [DF_TB_Users_UserLoginState] DEFAULT ((2)),
[UserActionTime] [smalldatetime] NULL,
[LastLoginTime] [smalldatetime] NULL,
[LoginTimes] [bigint] NULL CONSTRAINT [DF_TB_Users_LoginTimes] DEFAULT ((0)),
[IsEnabled] [smallint] NOT NULL,
[CreateDate] [smalldatetime] NOT NULL,
[Re] [nvarchar](100) NULL,
[CreateBy] [int] NOT NULL,
CONSTRAINT [TB_Users_PK] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[TB_FunctionAction] WITH CHECK ADD CONSTRAINT [TB_ActionType_TB_FunctionAction_FK1] FOREIGN KEY([ActionTypeID])
REFERENCES [dbo].[TB_ActionType] ([ActionTypeID])
GO
ALTER TABLE [dbo].[TB_FunctionAction] CHECK CONSTRAINT [TB_ActionType_TB_FunctionAction_FK1]
GO
ALTER TABLE [dbo].[TB_FunctionAction] WITH CHECK ADD CONSTRAINT [TB_SysFunctions_TB_FunctionAction_FK1] FOREIGN KEY([FunID])
REFERENCES [dbo].[TB_SysFunctions] ([FunID])
GO
ALTER TABLE [dbo].[TB_FunctionAction] CHECK CONSTRAINT [TB_SysFunctions_TB_FunctionAction_FK1]
GO
ALTER TABLE [dbo].[TB_SysRole] WITH CHECK ADD CONSTRAINT [TB_Users_TB_SysRole_FK1] FOREIGN KEY([UserID])
REFERENCES [dbo].[TB_Users] ([UserID])
GO
ALTER TABLE [dbo].[TB_SysRole] CHECK CONSTRAINT [TB_Users_TB_SysRole_FK1]
GO
ALTER TABLE [dbo].[TB_SysRoleList] WITH CHECK ADD CONSTRAINT [TB_SysFunctions_TB_SysRoleList_FK1] FOREIGN KEY([FunID])
REFERENCES [dbo].[TB_SysFunctions] ([FunID])
GO
ALTER TABLE [dbo].[TB_SysRoleList] CHECK CONSTRAINT [TB_SysFunctions_TB_SysRoleList_FK1]
GO
ALTER TABLE [dbo].[TB_SysRoleList] WITH CHECK ADD CONSTRAINT [TB_SysRole_TB_SysRoleList_FK1] FOREIGN KEY([RoleID])
REFERENCES [dbo].[TB_SysRole] ([RoleID])
GO
ALTER TABLE [dbo].[TB_SysRoleList] CHECK CONSTRAINT [TB_SysRole_TB_SysRoleList_FK1]
GO
ALTER TABLE [dbo].[TB_UserRoles] WITH CHECK ADD CONSTRAINT [TB_SysRole_TB_UserRoles_FK1] FOREIGN KEY([RoleID])
REFERENCES [dbo].[TB_SysRole] ([RoleID])
GO
ALTER TABLE [dbo].[TB_UserRoles] CHECK CONSTRAINT [TB_SysRole_TB_UserRoles_FK1]
GO
ALTER TABLE [dbo].[TB_UserRoles] WITH CHECK ADD CONSTRAINT [TB_Users_TB_UserRoles_FK1] FOREIGN KEY([UserID])
REFERENCES [dbo].[TB_Users] ([UserID])
GO
ALTER TABLE [dbo].[TB_UserRoles] CHECK CONSTRAINT [TB_Users_TB_UserRoles_FK1]
GO
ALTER TABLE [dbo].[TB_Users] WITH CHECK ADD CONSTRAINT [TB_Department_TB_Users_FK1] FOREIGN KEY([DepID])
REFERENCES [dbo].[TB_Department] ([DepID])
GO
ALTER TABLE [dbo].[TB_Users] CHECK CONSTRAINT [TB_Department_TB_Users_FK1]
GO
ALTER TABLE [dbo].[TB_Users] WITH CHECK ADD CONSTRAINT [TB_Duty_TB_Users_FK1] FOREIGN KEY([DutyID])
REFERENCES [dbo].[TB_Duty] ([DutyID])
GO
ALTER TABLE [dbo].[TB_Users] CHECK CONSTRAINT [TB_Duty_TB_Users_FK1]
TB_Users 本系统用户表
TB_UserRoles 用户角色表
TB_SysRole 系统角色表
TB_SysRoleList 系统角色权限表
TB_SysFunctions 系统功能模块表(操作页面)
TB_FunctionAction 模块操作表(页面功能)
TB_ActionType 功能操作类型表
服务器: 消息 170,级别 15,状态 1,行 8
第 8 行: '(' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 8
第 8 行: '(' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 11
第 11 行: '(' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 10
第 10 行: '(' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 9
第 9 行: '(' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 9
第 9 行: '(' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 36
第 36 行: '(' 附近有语法错误。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_FunctionAction',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_FunctionAction',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_FunctionAction',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_FunctionAction',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_SysRole',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_SysRole',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_SysRoleList',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_SysRoleList',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_SysRoleList',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_SysRoleList',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_UserRoles',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_UserRoles',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_UserRoles',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_UserRoles',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_Users',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_Users',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_Users',因为数据库 'Test' 中不存在此表。
服务器: 消息 4902,级别 16,状态 1,行 1
无法更改表 'dbo.TB_Users',因为数据库 'Test' 中不存在此表。
ALTER TABLE [dbo].[TB_Users] CHECK CONSTRAINT [TB_Department_TB_Users_FK1]
GO
ALTER TABLE [dbo].[TB_Users] WITH CHECK ADD CONSTRAINT [TB_Duty_TB_Users_FK1] FOREIGN KEY([DutyID])
REFERENCES [dbo].[TB_Duty] ([DutyID])
GO
ALTER TABLE [dbo].[TB_Users] CHECK CONSTRAINT [TB_Duty_TB_Users_FK1]最后这几行
你那个实在是太强了
我学习起来要有一段时间
所以得先找个简单的把公司网页做权限谢谢
http://www.cnblogs.com/Roping/archive/2007/02/13/649161.html这个项目采用分层的方式进行组织开发,但是分层不够彻底!看他的项目组织方式可以看出他是WEB表示层(WEB)和应用层(core)两层的,Core这个工程其实应该再分不同工程,以便在部署的时候,可以对不同的DLL进行引用!1. DTO这个文件夹单分出来,作为不同层(物理也好。,罗辑也好)的传输对象,独立于不同的项目文件,最好让每个DTO对象继承一个抽象类,这样在做多态,注入,WBS等进行反射的时候可以节省很多代码(可以这里没有这样做)!2. Domain这层是NHibernate的域模型层!主要采用hbm配置文件的方式实现对象的数据库映射关联!注意hbm文件采用潜入式资源的方式进行编译!这层代码基本上可以不用手写,呵呵,包括上面介绍的DTO也用手写,大家可以采用CodeSmith等工具进行生成,NHibernate本身也提供这样的工具NHibernate.Tool.hbm2net,我个人喜欢MyGeneration!3. Service,这层就是我们通常讲的业务逻辑层,对于对象的CRUD操作都是在这层进行逻辑验证分类等,这里面的逻辑一般集中在业务领域逻辑,设计到数据层业务逻辑象数据表级联删除更新等逻辑在Domain配置文件已经做好,字段长度格式等验证我们已经在WEB做了验证!这个也符合我们通常做法!4. NHHelper,这层是我们通常说说的数据访问层,对NB提供的对象持久化功能进行封装,实现对不同数据库的透明支持!同时也实现对NH中数据访问对象的Cache策略!5. Util,这个项目镇的应该单独分出来,看项目名字你就知道了,提供常用的功能类!roapzone(宗璞))强