出现传入后台参数为 null 的问题

1.检查报错问题,通过控制台报错问题查找

2.查看前端传入的参数是否有值

3.查看设置的form表单里是否有该参数对应的隐藏域

4.控制台看不出问题,在后端加断点,查看是在哪行代码出错,进行错误分析

5.检查后台是否定义了该变量

6.检查后台该变量的set、get是否正常生成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,这个插件并不是傻瓜式安装的,很多东西需要自己去调试,以下只给有一定基础的人,所以纯伸手党就不用看了 申明: 弹幕的接收和发送的最初源码来自此贴:http://www.discuz.net/thread-2499499-1-1.html 注: 下载后发现问题很多,所以我自己修改了一遍,剔除了代码中的大部分不合理的地方加入了控制最大弹幕数的,编码GBK测试无问题,utf-8未测试(应该是不会有问题的)。 此源码为最初版,后来还重写了记录吐槽者IP、整合至视频展厅以及管理弹幕的简易后台,根据情况我在开放下载吧 播放器使用的是mukioplayer:http://code.google.com/p/mukioplayer/ 如果你要转载下面的内容,那么请注明原帖地址 --------------------------------------------我是分割线-------------------------------------------- 源码下载(内含v1.150mukioplayer): 2012-04-25第3次更新 1.追加简易后台管理一枚 2012-04-17第2次更新 1.修正了无法正确保存ZOOME字幕的问题 2012-04-05第1次更新 1.增加一个外置弹幕列表的播放器可自由选择任意一个使用 2.修改了php的引用代码和php默认不支持的函数 3.其他已知的问题 下载后需要编辑2个配置文件: 一.在config.php中设置你的数据库连接和可控制的最大弹幕数。 注:数据库填写的信息和你安装论坛时填写的一样,如果你是独立主机那么可以建立一个专门的MYSQL用户操作弹幕表,加强安全性 二.在conf.xml中设置弹幕播放器的接收和发送URL地址。  1.post.php为接收从弹幕中传入参数的  2.xml.php为生成弹幕文件的 三.关于后台:  1.可以更改admin这个文件夹名字来隐藏后台路径提高安全性  2.使用前请先配置后台文件夹中的admin.php后台基本设定,具体规则参见每行的注释  3.后台访问路径既:http://你的域名/bplayer/后台文件夹名称/admin.php 配置完成后把文件夹上传到根目录中即可 --------------------------------------------我是分割线-------------------------------------------- 进入后台 - 站长 - 数据库 - 升级中运行以下SQL语句: CREATE TABLE IF NOT EXISTS `tm_comment` ( `ID` int(12) NOT NULL auto_increment, `playerID` varchar(15) default NULL, `message` text, `color` varchar(12) default NULL, `fontsize` varchar(12) default NULL, `playtime` varchar(12) default NULL, `mode` varchar(12) default NULL, `times` datetime default NULL, KEY `ID` (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ; --------------------------------------------我是分割线-------------------------------------------- 在看到后台的界面 - 编辑器设置 - Discuz! 代码,新增一个标签,名称随意,这里我们就用iplay,添加后点击详情,在替换内容中添加如下代码: <embed width='800' height='353' quality='high' allowfullscreen='true' type='application/x-shockwave-flash' src='http://你的域名/bplayer/mukioplayer.swf?type={1}&vid;={2}'='http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash'/> 复制代码 例子中添加代码:[iplay={1}]{2}[/iplay] 解释:添加弹幕播放器 参数个数:2 参数提示语: 视频类型 视频的ID 镶套次数:1 允许使用的用户组根据自己论坛的情况而定即可 --------------------------------------------我是分割线-------------------------------------------- 完毕,在帖子中使用 [iplay=视频类型]视频ID[/iplay] 就可以添加一个弹幕播放器测试了。 视频类型解释 : 新浪 sina或者video都可以 优酷 youku 新发现: QQ视频 qq (测试可用) 6间房 6room (未测试) 视频ID解释 : 例如一个视频地址是新浪的 http://you.video.sina.com.cn/b/25323843-1272884840.html 那么 - 前面的25323843 这个值就是这个视频的ID 优酷的话 http://v.youku.com/v_show/id_XMzIzNjA2NjE2.html 就是id_至.html中间的XMzIzNjA2NjE2 --------------------------------------------我是分割线-------------------------------------------- 播放器提示评论文件加载失败或者发送失败,但是弹幕可以正确保存到数据库中的解决方法: 打开config.php,复制全部内容(已经配置好了数据库信息的),在打开xml.php,选中require 'config.php';,粘贴全部内容,保存。 某些linx服务器会出现问题,临时用这个方法解决,暂时没有找到php生成xml不能包含其他文件的原因 --------------------------------------------我是分割线-------------------------------------------- 关于播放器侧边栏问题,压缩包里还有一个mukioplayer1.swf文件,将此文件与mukioplayer.swf替换,即可显示侧边栏 --------------------------------------------我是分割线-------------------------------------------- 总结:实现了基本的弹幕存储功能,但是管理很麻烦,而且安全性也有待加强,字段类型也弄的很随便,期待有强人来完善 若有问题可回帖,有时间我会回答,但不一定每个都回答(只针对本帖的内容和源码,在其他地方下的别问我) 此弹幕并不仅限DISCUZ论坛,PHPWIND及其他论坛也是可以整合的
一 Jeecms安装过程 将解压后得到的jeecms-3.0.2-final文件夹下的root文件夹更名为jeecms拷贝到tomcat 安装目录下的webapps 文件夹下(例如: D:\Tomcat 6.0\webapps\),启动tomcat,在地址栏中输入http://localhost:8080/jeecms, 您将看到第一步安装过程中的《用户许可协议》,勾选“我已经阅读并同意此 协议”,点击下一步, 接下来第二步安装过程中设置系统参数,系统会自动检测出一些配置项,请根据您的实际情 况填写,数据库密码不能为空。 点击提交后进入第三步进入最后的系统安装过程,安装过程可能需要十几秒的等待时间。安 装成功后将提示信息,请再重启Tomcat 完成安装。 Tomcat重启完毕之后,在浏览器的地址栏中输入http://localhost:8080/jeecms, 若系统正常显示默认的站点首页则表示JEECMS 已经顺利安装完成. 附: 系统管理后台登录:http://localhost:8080/jeecms/jeeadmin/jeecms/index.do 用户名:admin 密 码:password 图文安装步骤如下: 将解压后得到的ROOT文件夹拷贝到tomcat安装目录下的webapps文件夹下(例如:D:\Tomcat 6.0\webapps\),启动tomcat,在地址栏中输入http://localhost:8080,您将看到第一步安装过程中的《用户许可协议》,如图一所示,勾选“我已经阅读并同意此协议”,点击下一步, 图一:用户许可协议 接下来第二步安装过程中设置系统参数,系统会自动检测出一些配置项,请根据您的实际情况填写,如图二所示,数据库密码不能为空。 图二:系统参数设置 点击提交后进入第三步进入最后的系统安装过程,安装过程可能需要十几秒的等待时间。安装成功后将提示如图三所示的页面信息,请再重启Tomcat完成安装。 图三:系统安装完成 三、完成安装 Tomcat重启完毕之后,在浏览器的地址栏中输入http://localhost:8080,若系统正常显示默认的站点首页则表示JEECMS已经顺利安装完成.,如图四所示: 图四 站点首页 二 Jeecms项目导入myeclipse 1.在myeclipse中新建一个项目jeecms,将服务器中jeecms项目下web-inf文件夹下内容拷到新建项目中 解压缩jeecms-3.0.2-final-src,在src文件夹下会看到有三个压缩文件,如果只想进行普通的二次开发,可以只导入cms这个源码,删除jeecms-cms-identity-3.0.2-final.jar即可,如果想进行深入的二次开发,需要导入common和core源码,另导入common-lib下的jar包,删除jeecms-cms- identity-3.0.2-final.jar,jeecms-common-3.0.2-final.jar ,jeecms-core- identity-3.0.2-final.jar这三个jar包,切记:务必进行build path 3.修改jdbc链接,自己导入数据库。 4.把服务器下install\config下的web.xml复制出来覆盖掉新建项目WEB-INF下的web.xml 5.classes下有四个文件,手动烤到myeclipse项目src根目录下中 6.将服务器上jeecms项目删掉,发布新建的jeecms项目。 三 首页的加载过程 在浏览器中输入http://localhost:8080/jeecms,回车 首先进入配置文件web.xml, <context-param> <param-name>contextConfigLocation</param-name> <!----> <param-value> /WEB-INF/config/application-context.xml /WEB-INF/config/cache-context.xml /WEB-INF/config/captcha-context.xml /WEB-INF/config/jeecore-context.xml /WEB-INF/config/jeecms-context.xml </param-value> </context-param> 应用范围内的初始化参数 其中jeecms-context.xml是对标签的初始化 <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.shtml</welcome-file> <welcome-file>index.jhtml</welcome-file> </welcome-file-list> 通过以上标签找到应该加载哪一个页面 <servlet> <servlet-name>JeeCmsFront</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/jeecms-servlet-front.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.jhtml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.jspx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> 通过servlet配置,可以找到jeecms-servlet-front.xml,在此配置文件的最后有 <import resource="jeecms-servlet-front-action.xml"/>代码 找到jeecms-servlet-front-action.xml,在此配置文件中有 <bean id="dynamicAct" class="com.jeecms.cms.action.front.DynamicPageAct"/> 可以找到类DynamicPageAct,此类是首页模板。 在类DynamicPageAct中有 public static final String TPL_INDEX = "tpl.index"; 找到WEB-INF\languages\jeecms_front下messages_zh_CN.properties配置文件,可以找到对应的首页面 tpl.index=首页(工程中的首页.html文件) 四 标签的配置流程 以cms_content_list为例,首先,每一个标签的声明都是在jeecms-context.xml中进行的, <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true"> …… <bean id="cms_content_list" class="com.jeecms.cms.action.directive.ContentListDirective"/>(声明标签对应的类) <bean id="staticPageSvc" class="com.jeecms.cms.staticpage.StaticPageSvcImpl"> <property name="freeMarkerConfigurer"> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="freemarkerVariables"> <map> …… <entry key="cms_content_list" value-ref="cms_content_list"/> …… </map> </property> <property name="templateLoaderPath" value=""/> …… </bean> </property> </bean> </beans> 此外,在配置文件jeecms-servlet-front.xml中,还有一段对标签的配置 <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="freemarkerVariables"> <map> …… <entry key="cms_content_list" value-ref="cms_content_list"/> …… </map> </property> …… </bean> </bean> 类ContentListDirective继承自AbstractContentDirective,最主要的是execute方法 public class ContentListDirective extends AbstractContentDirective { /** * 模板名称 */ public static final String TPL_NAME = "content_list"; /** * 输入参数,文章ID。允许多个文章ID,用","分开。排斥其他所有筛选参数。 */ public static final String PARAM_IDS = "ids"; @SuppressWarnings("unchecked") public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { //获取站点 CmsSite site = FrontUtils.getSite(env); //获取内容列表,可以通过此处进行更改,获取自己数据库中的数据 List<Content> list = getList(params, env); Map<String, TemplateModel> paramWrap = new HashMap<String, TemplateModel>( params); //OUT_LIST值为tag_list,在类DirectiveUtils中声明,将内容列表放入其中 paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list)); //将params的值复制到variable中 Map<String, TemplateModel> origMap = DirectiveUtils .addParamsToVariable(env, paramWrap); //获取的是参数PARAM_TPL,是否调用模板以及调用的模板类型 InvokeType type = DirectiveUtils.getInvokeType(params); //获取传入参数,列表样式,根据不同的参数获取不同的样式列表 String listStyle = DirectiveUtils.getString(PARAM_STYLE_LIST, params); if (InvokeType.sysDefined == type) { if (StringUtils.isBlank(listStyle)) { throw new ParamsRequiredException(PARAM_STYLE_LIST); } //列表样式模板 env.include(TPL_STYLE_LIST + listStyle + TPL_SUFFIX, UTF8, true); } else if (InvokeType.userDefined == type) { if (StringUtils.isBlank(listStyle)) { throw new ParamsRequiredException(PARAM_STYLE_LIST); } //列表样式模板路径 WEB-INF\t\cms_sys_defined\style_list\style_2-1.html FrontUtils.includeTpl(TPL_STYLE_LIST, site, env); } else if (InvokeType.custom == type) { //这个模板就是自己声明的,即content_list.html,如果采用自定义模板的话,页面中可以只写上标签,并添加上标签内需要的几个参数,不需要写标签体的内容,会去自动调用模板中的标签体。 FrontUtils.includeTpl(TPL_NAME, site, params, env); } else if (InvokeType.body == type) { body.render(env.getOut()); } else { throw new RuntimeException("invoke type not handled: " + type); } //将variable中的params值移除 DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); } @SuppressWarnings("unchecked") protected List<Content> getList(Map<String, TemplateModel> params, Environment env) throws TemplateException { Integer[] ids = DirectiveUtils.getIntArray(PARAM_IDS, params); if (ids != null) { //根据内容ID数组获取文章列表 return contentMng.getListByIdsForTag(ids, getOrderBy(params)); } else { return (List<Content>) super.getData(params, env); } } @Override protected boolean isPage() { return false; } } Content_list.html中的内容 [#list tag_list as a] <li><a href="${a.url}" target="_blank">${a.title}</a></li> [/#list] 就是简单的将tag_list中的内容,即“paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list));”中放入的数据遍历出来 style_2-1.html中的内容 主要是对图文列表或标题列表向上滚动的样式的,其中包含两个同样为样式的文件 style_2-1_core.html(图文列表或标题列表向上滚动)和style_1-1_core.html(图文列表或标题列表向上滚动),在此就不做赘述了。 Jeecms是基于Spring注解,在自定义标签时对于实体类和dao service等注意注解的问题。 五 自定义标签及使用自己创建的表的实现过程 下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_mycontent的表,其中有id,title,content三个字段 其次,创建了一个实体类 public class MyContent { private static final long serialVersionUID = 1L; private Integer id; private String title; private String content; public MyContent () { super(); } ……get set方法 } 接下来是配置hibernate中jc_mycontent表的配置文件 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jeecms.cms.entity.main"> <class name="MyContent" table="jc_mycontent"> <meta attribute="sync-DAO">false</meta> <cache usage="read-write"/> <id name="id" type="java.lang.Integer" column="id"><generator class="identity"/></id> <property name="title" column="title" type="java.lang.String" not-null="true" /> <property name="content" column="content" type="java.lang.String" not-null="true" /> </class> </hibernate-mapping> 与数据库交互的持久层接口 public interface MyContentDao { public List<MyContent> getList(); } 持久层实现类 @Repository//持久层 public class MyContentDaoImpl extends HibernateBaseDao<MyContent, Integer> implements MyContentDao { @SuppressWarnings("unchecked") public List<MyContent> getList(){ return find(byNothing()); } private Finder byNothing(){ Finder f = Finder.create(); f.append("from MyContent");//可以在此处添加查询条件或者添加各种方法进行动态查询 f.setCacheable(true); return f; } @Override protected Class<MyContent> getEntityClass() { return MyContent.class; } } 业务层接口 public interface MyContentMng { public List<MyContent> getList(); } 业务层实现类 @Service//业务层 @Transactional public class MyContentMngImpl implements MyContentMng { @Transactional(readOnly = true)//配置事务为只读 public List<MyContent> getList(){ return myContentDao.getList(); } private MyContentDao myContentDao; @Autowired//自动绑定 public void setMyContentDao(MyContentDao myContentDao) { this.myContentDao = myContentDao; } private List<ContentListener> listenerList; @Autowired public void setListenerList(List<ContentListener> listenerList) { this.listenerList = listenerList; } } 标签类的抽象类,最主要的就是getData这个方法,以及绑定业务层,其中可以添加多种查询方法。可参考类AbstractContentDirective public abstract class AbstractMyContentDirective implements TemplateDirectiveModel { protected Object getData(Map<String, TemplateModel> params, Environment env) throws TemplateException { return myContentMng.getList(); } @Autowired protected MyContentMng myContentMng; } 自定义标签中最重要的类继承上边的抽象类 public class MyContentListDirective extends AbstractMyContentDirective { /** * 模板名称 */ public static final String TPL_NAME = "mycontent_list"; @SuppressWarnings("unchecked") public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { //获取站点 CmsSite site = FrontUtils.getSite(env); //获取内容列表 List<MyContent> list = getList(params, env); Map<String, TemplateModel> paramWrap = new HashMap<String, TemplateModel>(params); //OUT_LIST值为tag_list,将内容列表放入其中 paramWrap.put(MYOUT_LIST, DEFAULT_WRAPPER.wrap(list)); //将params的值复制到variable中 Map<String, TemplateModel> origMap = DirectiveUtils.addParamsToVariable(env, paramWrap); //没有采用默认的模板,直接采用自己写的简单的模板(mycontent_list.html) FrontUtils.includeTpl(TPL_NAME, site, params, env); //将variable中的params值移除 DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); } protected List<MyContent> getList(Map<String, TemplateModel> params, Environment env) throws TemplateException { return myContentMng.getList(); } } 样式模板mycontent_list.html内容,里边可以自己添加一些样式,可参考\t\cms_sys_defined\style_list下样式文件 [#list mytag_list as a] <li><a href="${a.title}"><font color='blue'>"${a.content}"</font></a></li> [/#list] 首页里加入如下代码 [@cms_mycontent_list] <ul class="topnews"> </ul> [/@cms_mycontent_list] 通过以上这些代码,可以实现将自己的表jc_mycontent中的数据查询并显示在页面上 六 标签使用和模板的制作 1模板规划 1.1资源文件 资源文件就是网页中用到的图片、CSS、JS等元素,在CMS系统中所有的资源文件在网站的根目录中的 /res_base/所属网站定义资源目录/TEMPLEATE/WEB /res_base/所属网站定义资源目录/TEMPLEATE/WAP 解释:网站定义资源 在CMS系统中可以同时管理多个网站,也就是多个网站可以同时使用一套CMS系统,但是每一个网站都已属于自己独立的资源文件及模板文件目录。 1.2模板文件 定义了页面显示的主体框架,它的位置位于网站根目录下的/WEB_INF/user_base/所属网站模板目录; 模板规则: 1、以index前缀命名的为首页模板 2、以channel前缀命名的为栏目模板 3、以content前缀命名的为内容模板 4、以alone前缀命名的为栏目单页模板 1.3使用方式 1、使用dw建立站点 2、将网页中用到的资源文件分类分别放置到网站相关资源目录中 3、将模板文件放置按照命名规则分别放置到网站相关模板目录中。 4、将头部、底部等等具有通用元素的模板文件放置到模板目录中的include目录中 5、将模板文件中所有资源引用改为绝对路径链接至资源目录中 6、在栏目管理中将模板文件与栏目进行关联设置 7、在模板文件中需要提取数据的位置放置相应的标签 1.4标签调用样式 调用"JEECMS标签"的三种代码样式如下:   A、${标签名称}   B、[@cms.标签名称 属性='值'/]   C、[@cms.标签名称 属性='值'; 标签别名] 自定义样式模板 [/@cms.标签名称]   例如: a、${web.name}标签用于调用网站名称 b、[@cms.ArtiList chnlId='' count='10' sysContent='1-1' /]标签用于调用 10篇文章的列表 C、[@cms.ChnlList id='' inner='1';c]|<a >>${c.name}</a> [/@cms.ChnlList]标签用于调用栏目列表,可用于网站导航条。   注意:abc实例是与上面ABC三种形式相对应的。大家可以逐个测试,举一反三 2 Include标签 2.1功能简介 做过网站设计经验的朋友可能都知道,我们可以将页面中经常要引用的公共部分(比如页头和页脚)独立开来,单独存放在一个页面中。这样做的好处就是可以在各个需要用到该部分的页面中用一个简单的包含语句就能把它引入进来,大大简化了工作量。 2.2标记说明 【标签名】:[@cms.Include 属性='值' /] 【作 用】:包含公用页面(如页头,页脚) 【参 数】: name:包含模板的文件名 solution:模板方案名 【示 例】: 包含页头:[@cms.Include name='head.html' solution='default'/] 【备 注】:调用此标签前必须先建立相应的包含模板 2.3 明确标签的使用范围   我们在使用任何标签的之前,都必须明确其使用的范围,否则可能无法正常使用该标签。   【Include 标签】的使用范围是:首页模板,栏目页模板,内容页模板,即对应\WEB-INF\user_base\jeecms_com_www\template\article\default\文件夹下的index_××.html模板、channel_××.html模板、content_××.html模板 2.4调试标签了解其使用方法   在使用【Include 标签】之前我们必须保证有可供此标签调用的包含模板,本实例只是起演示作用,为方便起见,这里就不再另外创建被包含的模板了,标签调用的是系统默认模板方案中的的head.html模板。 登录JEECMS后台,进入“模板管理->template->article->default”,点击修改开始时建立的index_demo.html模板(如果没有此模板则按照本文开头的说明创建),进入模板代码模式,填写如下标签代码(为了演示效果美观,本处代码中加入了css,可去除): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Include标签测试</title> <link href="${sysResRoot}/front.css" type="text/css" rel="stylesheet" /> <link href="${root}/default/article/css/whole.css" type="text/css" rel="stylesheet" /> <link href="${root}/default/article/css/layout.css" type="text/css" rel="stylesheet" /> </head> <body> [@cms.Include name='head.html' solution='default'/] </body> </html>   点保存按钮,然后返回前台站点首页刷新,得到如下效果: 3 ArtiList标签 3.1功能简介 【ArtiList 标签】在CMS中使用的频率可以说是最高的,通过这个标签,你不仅可以得到一个文章列表,而且可以通过不同的参数组合得到不同的显示效果。比如文章图文列表、文字或图片跑马灯、文字或图片上下循环滚动等等。 使用方式: [@cms.ArtiList chnlId='' count='5' sysContent='1-1' titLen='25' lineHeight='1' dateFormat='4' datePosition='2' headMark='2' target='1'/] 3.2标记说明 【标签名】:[@cms. ArtiList 属性='值' /] 【作 用】:获取文章列表数据 【参 数】: 属性名称 属性说明 默认值 可选值 chnlId 栏目ID,栏目页中可不设置,系统会自动获取当前栏目ID 当前栏目ID 空:显示全站文章列表; 栏目ID:指定栏目文章 attr 文章属性ID 空 1:普通 2:图文 3:焦点 4:头条 5:滚动 sysContent 列表显示方式 1-1 1-1:普通标题列表 1-2:图文列表 2-1:标题列表翻滚 2-2:图文列表翻滚 3-1:焦点图 orderBy 排序方式 0 0:发布时间降序; 1:发布时间升序; 2:固顶降序; 3:置顶降序; 4:日点击降序; 5:周点击降序; 6:月点击降序; 7:季点击降序; 8:年点击降序; 9:总点击降序 recommend 是否推荐 0 0:所有文章 1:推荐文章 titLen 标题长度 20 自定义 target 链接打开目标 0 0:原窗口打开 1:新窗口打开 headMark 文章标题图标 0 0:无图标 1:黑色小圆点 2:红色小圆点 3:蓝色单箭头 4:蓝色双箭头 自定义图标:填写图标路 lineHeight 文章列表每行的行高 空 自定义 bottomLine 每行标题下是否带下划分隔线 0 0:无分隔线 1:默认分隔线 自定义样式:css中定义的样式名称 ctgForm 文章类别形式 0 0:不显示文章类别 1:显示栏目类别 2:显示站点名称 ctgClass 文章类别的css-class 空 自定义css样式的class名 dateFormat 文章发布日期显示格式 0 0:不显示日期 1:”年-月-日 时-分-秒” 格式 2:”年-月-日” 格式 3:”月-日 时-分” 格式 4:”月-日” 格式 datePosition 日期排列位置 1 1:紧跟标题之后 2:右对齐 3:左对齐 isPage 是否显示分页 0 0:否;1:是 count 每页列表显示数量 20 自定义 cssStyle 连接的样式 空 自定义 仅当sysContent='1-2'(图文列表)时,以下标签属性才有效 picWidth 按百分比显示图片宽度 25(即每个图片占总宽度的25%,每行可放四张图片) 自定义 picHeight 每行图片显示高度 110 自定义 仅当sysContent='3-×'(焦点图)时,以下标签属性才有效 flashWidth 焦点图宽度 296(px) 自定义 flashHeight 焦点图总高度 200(px) 自定义 textHeight 焦点图文本高度 20(px) 自定义 仅当sysContent='2-×'(特效显示)时,以下标签属性才有效 rollDisplayHeight 显示区高度 28 自定义 rollLineHeight 行高 28 自定义 rollCols 列数(一行中包含几列) 1 自定义 rollSpeed 滚动速度,值越小越快,最小为1 1 自定义 isSleep 是否停顿 1 0:不停顿; 1:停顿 rollSleepTime 停顿时间,值越大停顿越久 50 自定义 rollCount 一次滚动的行数 1 自定义 rollSpan 一次滚动的像素 1 自定义 其它高级标签属性(用于用户个性设置) searchKey 在标题、tags和描述中搜索指定关键字的文章列表,用于搜索页模板 空 自定义关键字 style 标签内部样式,如果指定sysContent或userContent,则该项无效 1 1:普通列表 sysTpl 指定系统模板 1 自定义 sysContent 系统内容样式 0 自定义 userContent 用户内容样式,当sysContent=1时有效 空 自定义 sysPage 系统分页样式 0 自定义 userPage 用户分页样式,当sysPage=1时有效 空 自定义 upSolution 指定其它模板方案样式 空 自定义 upWebRes 指定其它站点样式 空 自定义 pageClass 分页栏css样式的class名称 空 自定义 pageStyle 分页栏css自定义style样式 空 自定义 3.3 明确标签使用范围   我们在使用任何标签的之前,都必须明确其使用的范围,否则可能无法正常使用该标签。 【ArtiList 标签】的使用范围是:首页模板,栏目页模板,内容页模板, 即对应\WEB-INF\user_base\jeecms_com_www\template\article\default\文件夹下的index_××.html模板、channel_××.html模板、content_××.html模板 3.4 调试标签了解其使用方法   登录JEECMS后台,进入“模板管理->template->article->default”,点击修改开始时建立的index_demo.html模板(如果没有此模板则按照本文开头的说明创建),在模板内容处填写如下标签代码(为了演示效果美观,本处代码中引入了系统默认css,可去除):(1).文章列表 <link href="${sysResRoot}/front.css" type="text/css" rel="stylesheet" /> [@cms.ArtiList chnlId='' count='5' sysContent='1-1' titLen='25' lineHeight='1' dateFormat='4' datePosition='2' headMark='2 target='1'/]  点保存按钮,然后返回前台站点首页刷新,得到如下效果: (2).图文列表 <link href="${sysResRoot}/front.css" type="text/css" rel="stylesheet/> [@cms.ArtiList chnlId='' attr='2' count='5' sysContent='1-2' titLen='25' target='1' picWidth='25' picHeight='110'/]   点保存按钮,然后返回前台站点首页刷新,得到如下效果: 4 Position标签 4.1功能简介 在网站页面中我们经常要显示当前页面的位置,例如:当前位置:首页 > 无线城市> 城市要闻 > 正文。在CMS标签中提供了一个显示页面的当前位置调用标签,只需将该标签放到页面的相应地方,设置好调用参数即可,简单方便。 4.2标记说明 【标签名】:[@cms.Position 属性='值' /] 【作 用】:显示页面的当前位置  【参 数】:   homepage —-首页显示方式。【1:站点简称;自定义】(默认:首页)   title ---内容页显示方式。【0:不显示;1:显示内容标题;自定义】(默认:正文)   split ---分割符号。(默认:“>”)   target ---是否原窗口打开。【0:原窗口打开;1:新窗口打开】(默认:原窗口打开)   class ---链接外部样式,等同于html中的class属性   style ---自定义标签样式,等同于html中的style属性  【示 例】:   [@cms.Position homepage='1' split='|' target='1' /] 【作 用】:显示各栏目列表 【参 数】: 属性名称 属性说明 默认值 可选值 id 父栏目ID 默认为空:自动获取当前栏目ID 空:当前栏目ID; 栏目ID:指定父栏目id orderBy 排序方式 0 0:优先级升序; 1:优先级降序; 2:点击次数升序;3:点击次数降序 isDisplay 是否只获取显示的栏目 1 0:获取所有; 1:只获取显示的栏目 hasContent 是否只获取可以有内容的栏目 0 0:获取所有; 1:只获取可以有内容的栏目 linkClass 链接class样式 空 linkTarget 链接打开方式 0 0:当前窗口; 1:新窗口 sysPage 系统分页样式 0 0:不分页; 1:样式一; 2:样式二 userPage 自定义分页样式。如果指定了系统分页样式,则该项无效 0 0:不分页; 1:样式一; 2:样式二 5.3明确标签的使用范围   我们在使用任何标签的之前,都必须明确其使用的范围,否则可能无法正常使用该标签。 [@cms.ChnlList /]标签的使用范围是:首页模板,栏目页模板,即对应\\WEB-INF\\user_base\\jeecms_com_www\\template\\article\\default\\文件夹下的index_××.html模板、channel_××.html模板 5.4调试标签了解其使用方法 1、单独标签调用示例: [@cms.ChnlList/] 2、自定义标签调用示例:    [@cms.ChnlList id='' inner='1';c,i]     <a href="${c.url}">${c.name}</a>[#if (i+1)%2==0]<br/>[/#if]    [/@cms.ChnlList] 3、配合其它标签嵌套调用示例: [@cms.ChnlList id='' sysType='article' hasContent='1' inner='1';c] <table width="300" border="0" cellpadding="0" cellspacing="1" bgcolor="#eee"> <tr> <td height="30" bgcolor="#EEEEEE"><a target="_blank" href="${c.url}">${c.name}</a></td> </tr> <tr> <td bgcolor="#FFFFFF">[@cms.ArtiList chnlId=c.id sysContent='1-1' titLen='20' count='6' /]</td> </tr> </table> [/@cms.ChnlList] 6内容页常用标签 6.1标记说明 【文章导航】:[@cms.Position /] 【文章标题】:${arti.title} 【简短标题】:${arti.shortTitle} 【文章作者】:${arti.author} 【发布日期】:${arti.releaseDate} 【查看次数】:${arti.visitTotal} 【文章来源】:${arti.origin} 【文章摘要】:${arti.description} 【文章内容】:${arti.content}
软件编程规范培训实例与练习 软件编程规范培训实例与练习  问题分类 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和环境、其他函数、全局/局部变量或数据变量之间的数据/控制传输不匹配的问题,在系统中起重要作用,将导致模块间配合失效等严重问题; 维护类问题(C类)-指设计、编码中出现的对软件系统的维护方便程度造成影响的问题,在系统中不起关键作用,但对系统后期维护造成不便或导致维护费用上升; 可测试性问题(D类)-指设计、编码中因考虑不周而导致后期系统可测试性差的问题。  处罚办法 问题发生率: P=D/S D=DA+0.5DB+0.25DC 其中: P -问题发生率 D -1个季度内错误总数 DA -1个季度内A类错误总数 DB -1个季度内B类错误总数 DC -1个季度内C类错误总数 S -1个季度内收到问题报告单总数 1)当D≥3时,如果P≥3%,将进行警告处理,并予以公告; 2)当D≥5时,如果P≥5%,将进行罚款处理,并予以公告。 目 录 一、逻辑类代码问题 第5页 1、变量/指针在使用前就必须初始化 第5页 【案例1.1.1】 第5页 2、防止指针/数组操作越界 第5页 【案例1.2.1】 第5页 【案例1.2.2】 第6页 【案例1.2.3】 第7页 【案例1.2.4】 第8页 3、避免指针的非法引用 第9页 【案例1.3.1】 第9页 4、变量类型定义错误 第10页 【案例1.4.1】 第10页 5、正确使用逻辑与&&、屏蔽&操作符 第17页 【案例1.5.1】 第17页 6、注意数据类型的匹配 第18页 【案例1.6.1】 第18页 【案例1.6.2】 第18页 7、用于控制条件转移的表达式及取值范围是否书写正确 第20页 【案例1.7.1】 第20页 【案例1.7.2】 第21页 【案例1.7.3】 第22页 8、条件分支处理是否有遗漏 第24页 【案例1.8.1】 第24页 9、引用已释放的资源 第26页 【案例1.9.1】 第26页 10、分配资源是否已正确释放 第28页 【案例1.10.1】 第28页 【案例1.10.2】 第29页 【案例1.10.3】 第30页 【案例1.10.4】 第32页 【案例1.10.5】 第33页 【案例1.10.6】 第35页 【案例1.10.7】 第38页 11、防止资源的重复释放 第39页 【案例1.11.1】 第39页 12、公共资源的互斥性和竞用性 第40页 【案例1.12.1】 第40页 【案例1.12.2】 第40页 二、接口类代码问题 第43页 1、对函数参数进行有效性检查 第43页 【案例2.1.1】 第43页 【案例2.1.2】 第43页 【案例2.1.3】 第44页 【案例2.1.4】 第46页 【案例2.1.5】 第47页 【案例2.1.6】 第48页 2、注意多出口函数的处理 第49页 【案例2.2.1】 第49页 三、维护类代码问题 第51页 1、 统一枚举类型的使用 第51页 【案例3.1.1】 第51页 2、 注释量至少占代码总量的20% 第51页 【案例3.2.1】对XXX产品BAM某版本部分代码注释量的统计 第51页 四、产品兼容性问题 第52页 1、系统配置、命令方式 第52页 【案例4.1.1】 第52页 【案例4.1.2】 第53页 2、设备对接 第54页 【案例4.2.1】 第54页 3、其他 第55页 【案例4.3.1】 第55页 五、版本控制问题 第58页 1、新老代码中同一全局变量不一致 第58页 【案例5.1.1】 第58页 六、可测试性代码问题 第59页 1、调试信息/打印信息的正确性 第59页 【案例6.1.1】 第59页 一、逻辑类代码问题 1、变量/指针在使用前就必须初始化 【案例1.1.1】 C语言中最大的特色就是指针。指针的使用具有很强的技巧性和灵活性,但同时也带来了很大的危险性。在XXX的代码中有如下一端对指针的灵活使用: ... ... _UC *puc_card_config_tab; ... ... Get_Config_Table(
阿里代码规范题目+答案50道题,不乱码不套路,便宜实惠。 多选 1.如何处理单元测试产生的数据,下列哪些说法是正确的?ABC A .测试数据入库时加特殊前缀标识。 B .测试数据使用独立的测试库。 C .自动回滚单元测试产生的脏数据。 D .无须区别,统一在业务代码中进行判断和识别。 多选 2.关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步调用应该考虑到性能损耗。 C .创建线程或线程池时,推荐给线程指定一个有意义的名称,方便出错时回溯。 D .推荐使用Executors.newFixedThreadPool(int x)生成指定大小的线程池。(线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式) 多选 3.下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序中清理出去,避免造成过多垃圾。 B .永久弃用的代码段注释掉即可,即不用加任何注释。 C .对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三 个斜杠(///)来说明注释掉代码的理由。 D .不要在视图模板中加入任何复杂的逻辑。 多选 4.关于分页查询,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .分页查询,当统计的count为0时,应该直接返回,不要再执行分页查询语句。 B .iBATIS自带的queryForList(String statementName,int start,int size)分页接口有性能隐患,不允许使用。 C .定义明确的sql查询语句,通过传入参数start和size来实现分页逻辑。 D .可使用存储过程写分页逻辑,提高效率。 多选 5.根据《阿里巴巴Java开发手册》,以下功能必须进行水平权限控制校验的有:ABCD A .订单详情页面。 B .类目管理后台。 C .店铺装修后台。 D .订单付款页面。 多选 6.关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》:BD A .NULL=NULL的返回结果为true。 B .NULL与任何值的比较结果都为NULL。 C .NULL<>1的返回结果为true。 D .当某一列的值全是NULL时,sum(col)的返回结果为NULL。 多选 7.关于接口使用抛异常还是返回错误码,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .向公司外部提供的http/api接口,推荐使用“错误码”方式返回异常或者错误信息。 B .对于应用内部的方法调用,推荐使用“抛出异常”的方式处理异常或者错误信息。 C .跨应用的RPC调用,推荐使用将“错误码”和“错误简短信息”封装成Result的方式进行返回。 D .对外提供的接口,一定要保证逻辑健壮性:尽量避免空指针等技术类异常;对于业务类异常要做好错误码或者异常信息的封装。 单选 8.关于类的序列化,下列说法哪些是正确的:D A .类的序列化与serialVersionUID毫无关系。 B .如果完全不兼容升级,不需要修改serialVersionUID值。 C .POJO类的serialVersionUID不一致会编译出错。 D .POJO类的serialVersionUID不一致会抛出序列化运行时异常。 多选 9.关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》:BCD A .在接口类中的方法和属性使用public修饰符。 B .对于Service类,内部的实现类加Impl的后缀与接口区别。例如:ProductServiceImpl实现ProductService接口。 C .对于Service类,基于SOA的理念,是以接口方式暴露服务。 D .尽量不在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,而且是整个应用的基础常量。 单选 10.集合在遍历过程中,有时需要对符合一定条件的元素进行删除,下列哪些说法是正确的:B A .在 foreach 循环里进行元素的 remove操作。 B .使用Iterator方式,如果有并发,需要对Iterator对象加锁。 C .Iterator进行元素的删除操作,绝对是线程安全的。 D .Java无法实现在遍历时,进行删除元素操作。 多选 11.关于基本数据类型与包装数据类型的使用标准,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .所有的POJO类属性必须使用包装数据类型。 B .RPC方法的返回值和参数必须使用包装数据类型。 C .因为JAVA的自动装箱与拆箱机制,不需要根据场景来区分数据类型。 D .所有的局部变量推荐使用基本数据类型。 多选 12.关于索引的设计,下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对varchar类型的字段建立索引,必须指定索引长度。 B .对varchar类型的字段建立索引,不需要指定索引长度,这样索引区分度最好。 C .业务上具有唯一特性的字段(含组合字段),必须指定唯一索引。 D .建复合索引时,一般选择区分度高的字段放在最左列。 多选 13.关于二方库版本号的命名方式,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .版本号命名格式:主版本号.次版本号.修订号。 B .主版本号:产品方向改变,或者大规模API不兼容,或者架构不兼容升级。 C .次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的API不兼容修改。 D .修订号:保持完全兼容性,修复BUG、新增次要功能特性等。 多选 14.关于索引的使用,下列哪些说法是正确的:BCD A .查询语句 WHERE a+1 = 5 可以利用a索引。 B .查询语句WHERE date_format(gmt_create, '%Y-%m-%d') = '2016-11-11'无法利用gmt_create索引。 C .当 c 列类型为 char 时,查询语句 WHERE c = 5 无法利用c索引。 D .索引字段使用时不能进行函数运算。 多选 15.关于生产环境的日志文件,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .异常信息应该包括两类信息:案发现场信息和异常堆栈信息。 B .日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特点。 C .避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。 D .错误日志和业务日志尽量分开存放。 多选 16.关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .特殊注释标记,请注明标记人与标记时间。 B .待办事宜(TODO):( [标记人,标记时间,[预计处理时间]) C .在注释中用FIXME标记某代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进 D .在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况 多选 17.关于MySQL性能优化的描述,下列哪些说法是正确的:ABCD A .主键查询优先于二级索引查询。 B .表连接有一定的代价,故表连接数量越少越好。 C .一般情况下,二级索引扫描优先于全表扫描。 D .可以使用通过索引避免排序代价。 多选 18.关于索引的设计和使用,下列哪些说法是正确的:AD A .若查询条件中不包含索引的最左列,则无法使用索引。 B .对于范围查询,只能利用索引的最左列。 C .对于order by A或group by A语句,在A上建立索引,可以避免排序。 D .对于多列排序,需要所有所有列排序方向一致,才能利用索引。 多选 19.关于类命名,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .抽象类命名使用Abstract或Base开头。 B .异常类命名使用Exception结尾。 C .测试类命名以它要测试的类的名称开始,以Test结尾。 D .如果使用到了设计模式,建议在类名中体现出具体模式。例如代理模式的类命名:LoginProxy;观察者模式命名:ResourceObserver。 多选 20.关于数据库模糊检索的描述,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .绝对禁止左模糊。 B .绝对禁止全模糊。 C .绝对禁止右模糊。 D .全模糊或左模糊查询需求,优先使用搜索引擎。 多选 21.关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .所有的抽象方法(包括接口中的方法)必须要用javadoc注释。 B .所有的方法,包括私有方法,最好都增加注释,有总比没有强。 C .过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。 D .我的命名和代码结构非常好,可以减少注释的内容。 多选 22.关于checked/unchecked exception,下列哪些说法是正确的:BCD A .继承java.lang.Error的类属于checked exception。 B .checked异常继承java.lang.Exception类。 C .unchecked异常继承java.lang.RuntimeException类。 D .NullPointerException , IllegalArgumentException属于unchecked exception。 单选 23.关于Map类型集合的遍历方式,下列哪些说法是正确的:D A .Map类型的实现类都同时实现了Iterator接口。 B .使用foreach进行遍历。 C .推荐使用keySet进行遍历。 D .推荐使用entrySet进行遍历。 多选 24.关于变量、方法名、包的命名,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .POJO类中的任何布尔类型的变量,都不要加is,因为部分框架解析时有可能会出现序列化错误。 B .包名统一使用单数形式,如:com.alibaba.mpp.util。 C .中括号是数组类型的一部分,数组定义如下:String[] args; 不要误写为String args[]; D .Service/DAO层方法命名可以参考规约,例如:删除的方法推荐使用remove或delete做前缀。 多选 25.关于常量定义,下列哪些说法符合《阿里巴巴Java开发手册》:AC A .不允许出现任何魔法值(即未经预先定义的常量)直接出现在代码中。 B .魔法值是指程序中随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码中写if(status == 3) return error;符合规范。 C .如果变量值仅在一个范围内变化推荐用Enum类。 D .在程序中,一律禁止使用枚举类型。 多选 26.关于maven依赖、仲裁、规则,下列哪些说法是正确的:ACD A .<dependencies>的依赖会默认传递给子项目。 B .<dependencies>的依赖绝对不会传递给子项目。 C .在<dependencyManagement>中指定版本号。 D .避免在不同的子项目,声明同一个二方库的不同版本号。 单选 27.关于二方库升级,下列哪些说法是正确的:B A .升级二
mybatis执行sql语句部分参数返回null问题通常是由于参数类型与实际传入参数类型不匹配导致的。为了解决这个问题,我们需要对参数进行调试和检查。下面,我们提供几种常用的解决方案。 1.在SqlMapper.xml中添加参数类型 在SqlMapper.xml文件中对参数类型进行明确声明,可以避免参数传递出现歧义。例如,在参数为字符串类型时,可以使用如下的方式声明参数类型: <parameterMap type="java.lang.String" /> 2.修改Java对象对应的类 在Java对象对应的类中,修改该属性的类型,使其与数据库对应的列类型一致。例如,如果数据库中的列为varchar类型,就需要将Java对象的类对应属性的类型设置为String类型。 3.使用TypeHandler 通过使用TypeHandler,可以将Java对象的属性映射到数据库中对应的列上,避免了参数类型不匹配的情况。例如,对于通过Java对象传递的时间,可使用如下的TypeHandler实现对时间进行转换: public class DateTypeHandler extends BaseTypeHandler<Date> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { ps.setTimestamp(i, new Timestamp(parameter.getTime())); } @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { return new Date(rs.getTimestamp(columnName).getTime()); } @Override public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new Date(rs.getTimestamp(columnIndex).getTime()); } @Override public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new Date(cs.getTimestamp(columnIndex).getTime()); } } 使用TypeHandler,可以将Java对象的属性与数据库对应的列进行映射,解决参数类型不匹配的问题。 总之,解决mybatis执行sql语句部分参数返回null问题需要认真检查参数类型的匹配问题,并对参数类型进行适当的调整和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚小二

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值