jeesite的框架的学习

1.  平台简介

JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台。

JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎。

JeeSite主要定位于企业信息化领域,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具组件、视图操作组件、工作流组件、代码生成等。前端界面风格采用了结构简单、性能优良、页面美观大气的Twitter Bootstrap页面展示框架。采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。使用Maven做项目管理,提高项目的易开发性、扩展性。

JeeSite目前包括以下三大模块,系统管理(SYS)模块、内容管理(CMS)模块、在线办公(OA)模块、代码生成(GEN)模块。 系统管理模块 ,包括企业组织架构(用户管理、机构管理、区域管理)、菜单管理、角色权限管理、字典管理等功能; 内容管理模块 ,包括内容管理(文章、链接),栏目管理、站点管理、公共留言、文件管理、前端网站展示等功能; 在线办公模块 ,提供简单的请假流程实例。

JeeSite 提供了常用工具进行封装,包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构数据(用户、机构、区域)以及其它常用小工具等。另外还提供一个强大的在线 代码生成 工具,此工具提供简单的单表、一对多、树结构功能的生成,如果对外观要求不是很高,生成的功能就可以用了。如果你使用了JeeSite基础框架,就可以很高效的快速开发出,优秀的信息管理系统。

2. 内置功能

1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。

2. 机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。

3. 区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。

4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。

5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。

6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护,如:是否、男女、类别、级别等。

7. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。

8. 连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。

9. 工作流引擎:实现业务工单流转、在线流程设计器。

3. 开发工具

1. Eclipse IDE:采用Maven项目管理,模块化。

2. 在线演示:演示系统常用组件的使用代码,内嵌地图案例等。

3. 代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式增删改查单表、一对多、树结构。生成后的代码如果不需要注意美观程度,生成后即可用。

4. 设计思想

1、 分层设计:(数据访问层,业务逻辑层,展示层)层次清楚,低耦合,各层必须通过接口才能接入并进行参数校验(如:在展示层不可直接操作数据库),保证数据操作的安全。

2、 双重验证:用户表单提交双验证:包括服务器端验证及客户端验证,防止用户通过浏览器恶意修改(如不可写文本域、隐藏变量篡改、上传非法文件等)而跳过客户端验证操作数据库。

3、 安全编码:用户表单提交所有数据,在服务器端都进行安全编码,防止用户提交非法脚本及SQL注入获取敏感数据等,确保数据安全。

4、 密码加密:登录用户密码进行SHA1散列加密,此加密方法是不可逆的。保证密文泄露后的安全问题。

5、 访问验证:系统对所有管理端链接都进行用户身份权限验证,防止用户直接通过URL进行未授权页面。

6、 数据验证:对指定数据集权限进行过滤,七种数据权限可供选择(所有权限,公司及子公司,本公司,部门及子部门,本部门,本人数据,跨机构数据)

7、 快速编码:提供基本功能模块的源代码生成器,提高开发效率及质量。

5. 技术选型

1、后端

* 核心框架:Spring Framework 4.0

* 安全框架:Apache Shiro 1.2

* 视图框架:Spring MVC 4.0

* 服务端验证:Hibernate Validator 5.1

* 布局框架:SiteMesh 2.4

* 工作流引擎:Activiti 5.15

* 任务调度:Spring Task 4.0

* 持久层框架:MyBatis 3.2

* 数据库连接池:Alibaba Druid 1.0

* 缓存框架:Ehcache 2.6Redis

* 日志管理:SLF4J 1.7Log4j

* 工具类:Apache CommonsJackson 2.2Xstream 1.4Dozer 5.3POI 3.9

2、前端

* JS框架:JQuery 1.9

* CSS框架:Twitter Bootstrap 2.3.1

* 客户端验证:JQuery Validation Plugin 1.11

* 富文本:CKEcitor

* 文件管理:CKFinder

* 动态页签:Jerichotab

* 手机端框架:Jingle

* 数据表格:jqGrid

* 对话框:jQuery jBox

* 下拉选择框:jQuery Select2

* 树结构控件:jQuery zTree

* 日期控件: My97DatePicker

4、平台

* 服务器中间件:在Java EE 5规范(Servlet 2.5JSP 2.1)下开发,支持应用服务器中间件

Tomcat 6Jboss 7WebLogic 10WebSphere 8

* 数据库支持:目前仅提供Oracle数据库的支持,但不限于数据库,平台留有其它数据库支持接口,

可方便更改为其它数据库,如:SqlServer 2008MySql 5.5H2

* 开发环境:Java EEEclipseMavenGit

6. 必会基础知识

1. 软件工程基础、Java语言基础、JSP内置对象、EL表达式

2. Spring Framework:类的依赖、自动注入、事务处理

3. Spring MVCURL映射、参数传递

4. Apache Shiro:安全拦截方式,应用方法,控制按钮

5. SiteMesh:布局框架的用法

6. JSP标准标签库(JSTL):ifchooseforEachset

7. Spring MVC表单标签库:forminputtextareaselectcheckbox

8. 文件存放规范,命名规范。

7. 学习索引

1. Spring Framework

· 跟我学Spring3

2. Spring MVC 

· 跟开涛学Spring MVC

· JSP语法Spring FormJSTLEL

· Bean Validation

3. Apache Shiro 

· 官方文档

· 快速入门

4. SiteMesh 2.4

· 官方文档

· 入门实例标签使用装饰文件

5. Bootstrap 2.3

· Bootstrap官网

· Bootstrap中文网

6. jQuery

· jQuery API官方文档  中文文档

· jQuery Validation官方文档  使用范例

· jQuery zTree: 官方文档

· jQruey jBox官方文档

7. Activiti

· 官方网站

· 中文文档

· 咖啡兔Activiti

8. Ehcache

· 官方文档

· EhCache分布式缓存

9. 其它资料

· Alibaba Druid

· FreeMarker

· 8. 安装部署

1. 运行Maven目录下的settings.bat文件,用来设置maven仓库路径,并按提示操作(设置PATH系统变量、配置Eclipse)。

2. 执行jeesite/bin/eclipse.bat 生成工程文件并下载jar依赖包(如果需要修改默认项目名,请打开pom.xml修改第7artifactId,然后再执行eclipse.bat文件)。

3.  jeesite 工程导入到eclipse,选中工程,按F5刷新。

4. 设置数据源:src/main/resources/jeesite.properties

5. 导入数据表并初始化数据:运行db/init-db.bat文件。(导入时如果出现“drop”失败提示信息,请忽略。)

6. 新建ServerTomcat),注意选择以下两个选项:

7. 配置server.xmlConnector项,增加URIEncoding="UTF-8"

8. 部署到Tomcat,设置Auto ReloadDisabled

9. 访问工程:http://127.0.0.1:8080/ jeesite  用户名:thinkgem  密码:admin

9. 常见问题

1. 'mvn' 不是内部或外部命令,原因如下

a) PATH未配置或配置了多个不一致的Maven地址,如用户/系统变量。

b) M2_HOME系统/用户变量地址不正确,可删除M2_HOME变量。

c) 检查mvn运行是否正常,cmd执行:mvn -v

2. 运行eclipse.bat 找不到文件路径或乱码:一般原因是路径中包含空格或中文。

3. 导入到eclipse下找不到jar包:maven未配置,查看m2_repo仓库路径是否正确。

4. 运行init-db.bat提示ORA-xxx:根据错误码排除错误,一般是数据库url不对,用户名或密码错误。

5. 部署时出现某某被锁定,一般原因:Tomcat服务中的两个选项未选中。

6. 字典列表,添加键值,出现乱码:server.xml未配置url编码为utf-8


2章 文件结构与配置

作者:ThinkGem

更新日期:2014-4-8

1. 文件结构

1.1. 源码目录

src/main/java

 

com.thinkgem.jeesite

Jeesite平台目录

 ├ common

公共模块存放目录

 │ ├ beanvalidator

实体Bean验证相关类

│ ├ log

日志工具相关类

│ ├ mapper

各种ObjectXmlObjectJson的映射转换类

│ ├ persistence

持久层相关类

│ ├ security

安全相关类

│ ├ service

业务层相关类

│ ├ servlet

公共servlet相关类

│ ├ utils

各种操作小工具类

│ └ web

模型控制器层相关类

modules

JeeSite内置功能模块存放目录

act

Activiti工作流引擎目录

cms

内容管理、新闻发布模块目录

gen

Web版本代码生成器目录

oa

在线办公模块演示用例存放目录

sys

系统核心模块存放目录

 ├ dao

数据访问层相关类

 ├ entity

实体相关类

 ├ interceptor

系统模块拦截器相关类

 ├ service

业务处相关类

  ├ web

模型控制器层相关类

  └ utils

系统模块的工具类

1.2. 资源目录

src/main/resource

 

act

Activiti工作流引擎相关文件(部署文件、bpmn

cache

Ehcache缓存配置存放目录

mappings

Mybatis Sql映射文件存放目录

jeesite.properties

系统配置属性文件

spring-*.xml

Spring相关文件

log4j.properties

Log4j日志配置属性文件

1.3. 发布目录

src/main/webapp

 

static

静态文件存放目录(JSCSS、前端插件类库等)

compressor.bat

JavaScrptCSS文件压缩脚本

userfiles

用户上传文件目录

WEB-INF

WEB应用安全目录,通过映射访问相关文件。

 ├ lib

依赖jar包目录

tags

Tags标签存放目录

views

视图文件目录

│ ├ reportlets

帆软报表文件存放路径

│ ├ resources

帆软报表配置文件存放目录

 │ ├ error

系统异常映射相关页面

│ ├ include

视图相关包含文件

│ ├ layouts

视图布局相关文件

│ └ modules

内置核心功能模块视图相关文件

│    ├ act

Activiti模块视图相关文件

│    ├ cms

内容管理模块视图相关文件

│    ├ gen

代码生成模块视图相关文件

│    ├ oa

在线办公模块视图相关文件

│    └ sys

系统管理模块视图相关文件

├ ckfinder.xml

CKfinder配置文件

├ decorators.xml

Decorator配置文件

web.xml

Web配置文件

1.4. 执行目录

db

 

db

数据库相关脚本、模型及执行文件

act

各模块数据初始化, Oracle建表脚本,数据初始数据脚本文件。

cms

gen

oa

sys

└ init-db.bat

初始化数据库执行脚本(需要Maven支持)

 

bin

 

clean.bat

清理项目生成的文件脚本

eclipase.bat

生成eclipse项目执行脚本

package.bat

生成编译项目文件(war包)

run-jetty.bat

Jetty服务器运行脚本

run-tomcat6.bat

Tomcat6服务器运行脚本

run-tomcat7.bat

Tomcat7服务器运行脚本

2. jeesite.properties

2.1. 数据源配置

# 数据库驱动,连接设置。

jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl

jdbc.username=jeesite

jdbc.password=123456

 

# 连接池设置,初始大小,最小,最大连接数。

jdbc.pool.init=1

jdbc.pool.minIdle=3

jdbc.pool.maxActive=20

 

# 测试连接sql语句

jdbc.testSql=SELECT 'x' FROM DUAL

 

2.2. 系统配置

 

# 配置产品名称,版权日期和版本号

productName=JeeSite Admin

copyrightYear=2014

version=V1.1.1

 

# 是否是演示模式,如果是,则如下模块,无法进行保存操作

# sys: area/office/user/role/menu/dict, cms: site/category

demoMode=false

 

# 管理端跟路径

adminPath=/a

 

# 前端跟路径

frontPath=/f

 

# 信息发布时的URL后缀,可配置HTML后缀的页面进行缓存

urlSuffix=.html

 

# 分页大小,默认每页15

page.pageSize=15

 

# 硕正组件是否使用Cache(一般开发阶段,关闭Cache

supcan.useCache=false

 

# 设置通知间隔访问时间,单位毫秒.

oa.notify.remind.interval=60000

2.3. 框架参数配置

 

# 设置SESSION超时时间,web.xml里设置无效,单位毫秒.

session.sessionTimeout=120000

session.sessionTimeoutClean=120000


 

# 缓存设置

ehcache.configFile=cache/ehcache-local.xml

#ehcache.configFile=cache/ehcache-rmi.xml

 

# 首页地址

web.view.index=/a

 

# 视图文件配置,前缀和后缀

web.view.prefix=/WEB-INF/views/

web.view.suffix=.jsp

 

# 最大上传字节数 10M=10*1024*1024(B)=10485760

web.maxUploadSize=10485760

 

# 设置日志拦截器,拦击的URI@RequestMapping

web.logInterceptExcludeUri=/, /login, /sys/menu/tree, /sys/menu/treeData, /oa/oaNotify/self/count

web.logInterceptIncludeRequestMapping=save, delete, import, updateSort


 

# 工作流配置

activiti.isSynActivitiIndetity=false

activiti.export.diagram.path=c:/activiti_diagram

#activiti font (windows font: \u5B8B\u4F53  linux font: simsun)

activiti.diagram.activityFontName=\u5B8B\u4F53

activiti.diagram.labelFontName=\u5B8B\u4F53

 

activiti.form.server.url=http://127.0.0.1:8075/xxxx

 

3. pom.xml

3.1. 修改项目名称

 

artifactId:项目名称   version:版本

修改完成后运行eclipse.bat重新生成项目文件。

3.2. 添加jar依赖包

可通过公司maven私服查询相应jar依赖包。

私服地址:http://192.168.11.36:8888/nexus/

如果公司私服上没有相应的依赖jar

1) 可联系王震添加依赖jar

2) jar文件拷贝项目WEB-INF下的lib目录,并配置pom,例如:

<dependency>

        <groupId>com.test</groupId>

        <artifactId>test-core</artifactId>

        <version>1.0</version>

        <scope>system</scope>

        <systemPath>

${project.basedir}/src/main/webapp/WEB-INF/lib/test-core-1.0.jar

</systemPath>

    </dependency>

3.3. 删除init-db插件

项目初始化完成后,一定要删除或重命名pom里面的init-db插件,防止项目进行中误操作运行了init-db.bat文件,数据库被清空。

 

4. 数据库设计

模型文件:/ jeesite/db/test/jeesite.erm

业务数据表必须包含以下公共字段:

 

5. 重要规范

1. 类注释:必须包含类功能描述,作者,时间

2. 方法注释:除非常容易理解的方法如getformsavedelete等方法外的方法必须加注释来说明用途,传递参数

3. 按照以上命名结构进行文件分配存放。

4. 视图文件名要加模块或功能前缀,例如actTaskTodoList.jsp,代表:工作流任务待办列表,不要写成list.jsptodoList.jsptaskTodoList.jsp

5. Sql与定义分离:不在万不得已的情况下不要写在java文件里,分离

 

3章 内置组件的应用

作者ThinkGem

更新日期:2014-01-05

1. 常用组件

1.1. 布局组件

布局文件配置:

/ jeesite/src/main/webapp/WEB-INF/decorators.xml

 

默认布局文件:

/ jeesite/src/main/webapp/WEB-INF/views/layouts/default.jsp

非公共,自己建立的布局文件:

/ jeesite/src/main/webapp/WEB-INF/views/模块路径/layouts/布局文件.jsp

使用布局文件:

JSPhead里添加:<meta name="decorator" content="default"/>

1.2. 用户工具   UserUtils.java   fns.tld

应用场景:在java文件或jsp页面上,获取当前用户相关信息

1. 获取当前用户:

1) UserUtils.getUser();

2) entity.currentUser()

3) ${fns:getUser()}

2. 获取当前用户部门:

1) UserUtils.getOfficeList()

2) ${fns:getOfficeList()}

3. 获取当前用户区域:

1) UserUtils.getAreaList()

2) ${fns:getAreaList()}

4. 获取当前用户菜单:

1) UserUtils.getMenuList()

2) ${fns:getMenuList()}

5. 获取当前用户缓存:

1) UserUtils.getCache(key);

2) ${fns:getCache(cacheName, defaultValue)}

6. 设置当前用户缓存:

1) UserUtils.putCache(key);

1.3. 全局缓存  CacheUtils.java

应用场景:系统字典

1. 设置应用程序缓存:CacheUtils.put(key);

2. 获取应用程序缓存:CacheUtils.get(key);

1.4. 字典工具  DictUtils.java

应用场景:系统全局固定的字典数据,javajsp中获取字典相关数据。

1. 根据类型和值获取字典标签(列表取值):

a) DictUtils.getDictLabel(String value, String type, String defaultValue)  

b) ${ fns:getDictLabel (value, type, defaultValue)}

2. 根据类型和标签获取字典值(根据标签取值):

a) DictUtils.getDictValue(String label, String type, String defaultLabel)

b) ${fns:getDictValue(label, type, defaultValue)}

3. 根据类型获取字典列表(下拉框,复选框,单选框):

a) DictUtils.getDictList(String type)

b) ${fns:getDictList(type)}

1.5. 功能权限控制

应用场景:访问功能授权,查看权限,编辑权限,导入权限,审核权限。

1. 给方法添加权限标志

@RequiresPermissions("sys:submodule:user:view")

@RequiresUser

2. 菜单中设置权限标志。

3. 判断权限:

SecurityUtils.getSubject().isPermitted("sys:user:edit")

4. 视图中控制按钮(shiro.tld):

<shiro:hasPermission name="sys:user:edit">

<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/> 

</shiro:hasPermission>

<!-- 任何一个符合条件的权限 -->

<shiro:hasAnyPermissions name="sys:user:view, sys:user:edit,">

<input id="btnSubmit" class="btn btn-primary" type="submit" value="返 回"/> 

</shiro: hasAnyPermissions>

 

 

1.6. 数据权限

应用场景:某用户访问数据范围:公司及子公司,本公司,部门及子部门,本部门,当前用户,明细设置。

 

// 生成数据权限过滤条件(dsfdataScopeFilter的简写,在xml中使用 ${sqlMap.dsf}调用权限SQL

user.getSqlMap().put("dsf", dataScopeFilter(user.getCurrentUser(), "o", "u"));

 

<!-- 分页查询用户信息 -->

<select id="findList" parameterType="User" resultMap="userResult">

SELECT

<include refid="userColumns"/>

FROM sys_user a

<include refid="userJoins"/>

WHERE a.del_flag = '0'

<!-- 数据范围过滤 -->

${sqlMap.dsf}

</select>

 

/**

 * 数据范围过滤

 * @param user 当前用户对象,通过“entity.getCurrentUser()”获取

 * @param officeAlias 机构表别名,多个用“,”逗号隔开。

 * @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数

 * @return 标准连接条件对象

 */

String dataScopeFilter (User user, String officeAlias, String userAlias)

1.7. 智能分页组件

// 设置分页参数,则分页,如果不设置,则根据条件获取全部

user.setPage(page);

// 执行分页查询

page.setList(userDao.findPage(user));

1.8. 树选择组件

标签文件:/ jeesite/src/main/webapp/WEB-INF/tags/treeselect.tag

1.8.1. 区域选择组件

 

<tags:treeselect id="area" name="area.id" value="${area.id}" labelName="area.name" labelValue="${area.name}"  title="区域" url="/sys/area/treeData" cssClass="input-small" allowClear="true" notAllowSelectParent="true"/>

多选需要加 checked="true" 属性

1.8.2. 公司选择组件

 

<tags:treeselect id="office" name="office.id" value="${user.office.id}" labelName="office.name" labelValue="${user.office.name}"  title="部门" url="/sys/office/treeData?type=1" cssClass="input-small" allowClear="true" notAllowSelectParent="true"/>

多选需要加 checked="true" 属性

1.8.3. 部门选择组件

 

<tags:treeselect id="office" name="office.id" value="${user.office.id}" labelName="office.name" labelValue="${user.office.name}"  title="部门" url="/sys/office/treeData?type=2" cssClass="input-small" allowClear="true" notAllowSelectParent="true"/>

多选需要加 checked="true" 属性

1.8.4. 人员选择组件

 

<tags:treeselect id="user" name="user.id" value="${user.id}" labelName="user.name" labelValue="${user.name}" title="用户" url="/sys/office/treeData?type=3" cssClass="input-small" allowClear="true" notAllowSelectParent="true"/>

多选需要加 checked="true" 属性

1.9. 文件选择、文件上传组件

<form:hidden path="name" htmlEscape="false" maxlength="255" class="input-xlarge"/>

<tags:ckfinder input="name" type="files" uploadPath="/test "/>

1.10. 富文本在线编辑器组件

<form:textarea id="name" htmlEscape="true" path="name" rows="4" maxlength="200" class="input-xxlarge"/>

<tags:ckeditor replace="name" uploadPath="/test " />

1.11. 其它工具

/src/main/java/com/thinkgem/jeesite/common/utils/ ...

Excel(Export/Import)StringUtilsDateUtilsFileUtilsEncodesCookieUtilsCollections3

2. 封装及组件

2.1. 工具类组件

1) UserUtils:用户工具类(获取当前用户的相关信息)。

2) CacheUtils:系统级别Cache工具类。

3) CookieUtilsCookie操作工具类

4) DateUtils:日期时间工具类。

5) FileUtils:文件操作工具类。

6) StringUtils:字符串操作工具类。

7) ExcelExcel导入导出,参考用户导入导出例子。

8) ReflectionsJava对象操作反射工具类。

9) BeanMapperBeanBeanBeanConllection的互转

10) JaxbMapperXMLObject互转。

11) JsonMapperJSONObject互转。

12) CryptosDigests:密钥工具类SHA1MD5

13) Collections3:集合对象工具类。

14) Encodes:各种编码转换工具类。

15) Exceptions:异常工具类。

16) FreeMarkersFreeMarkers模板工具类。

17) Identities:唯一标识生成算法工具类(uuidrandom

18) PropertiesLoader:属性文件操作工具类

19) Threads:线程相关操作工具类。

2.2. 自定义标签组件

1) ckeditor.tagHTML在线编辑器。

2) ckfinder.tag:在线文件管理。

3) iconselect.tagIcon图标选择。

4) message.tag:消息弹框。

5) validateCode.tag:验证码。

2.3. EL 函数组件

1) fns.tld:系统相关EL函数。

2.4. JavaScript 组件

1) jQuery:强大的js框架,动态特性,AJAX、插件扩展

2) jQuery Validate:基于jQuery的客户端校验插件。

3) jBox:基于jQuery的多功能对话框插件。

4) zTree:基于jQuery的树结构展示查看。

5) My7DatePicker:日期选择控件。

6) treeTable:基于jQuery的表格数显示插件。

7) CKEditor:富文本在线HTML编辑器。

8) CKFinder:在线文件资源管理器。

9) SuperSlide:基于jQuery的滑动门插件(滑动图片,Tab,横幅等)。

3. 界面UICSSJS

1. 主题CSS框架:http://v2.bootcss.com/base-css.html

2. 多功能下拉框:http://ivaynberg.github.io/select2/

3. 界面文档(查找class,查找css):http://www.bootcss.com/scaffolding.html

4. 前端验证: /src/main/webapp/static/jquery-validation/1.11.0/demo/index.html

5. 弹出对话框: /src/main/webapp/static/jquery-jbox/2.3/docs/jbox-demo.html

top.$.jBox.open('iframe:'+href,'查看评论',$(top.document).width()-220,$(top.document).height()-180,{

buttons:{"关闭":true},

loaded:function(h){

$(".jbox-content", top.document).css("overflow-y","hidden");

$(".nav,.form-actions,[class=btn]", h.find("iframe").contents()).hide();

$("body", h.find("iframe").contents()).css("margin","10px");

}

});


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值