hellolift学习笔记(9)

本文总结了Scala语言和LiftWeb框架的学习经验,详细介绍了UserUser组件的实现原理,包括继承Mapper框架、属性扩展、菜单实现等。此外,文章还提到了下一阶段的学习计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

至此,hellolift例子的分析对我来说已经完成了他的使命。虽然还遗留了一些没搞清楚的问题,但是基本上已经可以适应scala风格的代码阅读,对liftweb框架也有了一个基本成型的认识。至少我现在已经比较容易俯下身来去了解scala的一些细节,也可以比较轻松的去阅读liftweb的文档去掌握更多的内容。所以下一阶段会把学习重点暂时转移到《Programming In Scala》和《The Definitive Guide To Lift》的研读,同时自己做一些小东西。

今天来把这个系列笔记暂时结束掉。

10. User
User的实现继承了Mapper框架中的MegaProtoUser和MetaMegaProtoUser,并对他做了一些扩展,在这里重点学习了这种扩展方式和在菜单实现中的特殊的地方。

这里的User与框架的缺省实现,仅仅增加了一个blogtitle属性,这个属性通过signupFields来标识注册的时候需要填写这个字段。

通过重载dbTableName可以设定改变映射的table,如果不做这个系统会默认使用user_t的名称。

一度让我迷惑的是下面这个实现

override val basePath: List[String] = "user_mgt" :: "usr" :: Nil

在User中定义了basePath,在生成User相关的菜单时会生成/user_mgt/usr/login的url地址,但是在代码中找不到这样的目录及模板。
原来,Loc创建时的LocParam参数有一个子类是Template,这个子类注册一个函数,函数将处理请求,执行的结果将返回NodeSeq,作为页面的输出。
 /**
* Allows a user to specify a template based upon a function from the current
* value encapsulated in the Loc
*/
case class Template(template: () => NodeSeq) extends AnyLocParam


在User的实现中是这样的代码

...
Template(() => wrapIt(login))
...
protected def wrapIt(in: NodeSeq): NodeSeq =
screenWrap.map(new RuleTransformer(new RewriteRule {
override def transform(n: Node) = n match {
case e: Elem if "bind" == e.label && "lift" == e.prefix => in
case _ => n
}
})) openOr in
}
...
def login = {
if (S.post_?) {
...
}
bind("user", loginXhtml,
"email" -> (FocusOnLoad(<input type="text" name="username"/>)),
"password" -> (<input type="password" name="password"/>),
"submit" -> (<input type="submit" value={S.??("log.in")}/>))
}


def loginXhtml = {
(<form method="post" action={S.uri}><table><tr><td
colspan="2">{S.??("log.in")}</td></tr>
<tr><td>{S.??("email.address")}</td><td><user:email /></td></tr>
<tr><td>{S.??("password")}</td><td><user:password /></td></tr>
<tr><td><a href={lostPasswordPath.mkString("/", "/", "")}
>{S.??("recover.password")}</a></td><td><user:submit /></td></tr></table>
</form>)
}



这里的代码不再做详细的解释,说明几点
1) S.??是国际化的做法,用来读取properties文件定义的串值
2) 这里展示了toForm之外另一种输出页面内容的做法
3) 这里输出的只是核心的form内容,完整的页面在具体的应用确定,在通过在子类中定义screenWrap来实现这个控制。

其他的User相关的页面实现过程大体类似,不再赘述。

--------------------------------------------------------------------------------
题外话:写这个笔记的过程中发现,写点东西还真希望有很多的人关注,算是虚荣哈,感谢来看我写的东西的朋友们,有空还要多来踩一踩哈:)
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值