如何向用户询问一些数据(某些字段可以在以后修改),将其存储在数据库中,然后向网站用户显示一些收集的数据,以便所有数据库内容都不会在页面源代码?
这是一个完整的示例,在页面重新加载后,所有数据都在页面源中可见:
import stdlib.crypto
type user= {md5sum: string; name: string; email: string; is_achy: bool }
db /users : stringmap(user);
db /users[_]/is_achy = {false}
setup_page()=
(
<div id=#users>
<div class="container">
<table id=#lista >
<tr>
<th>Name</th>
<th>Headache?</th>
</tr>
{list_db()}
</table>
</div>
</div>
<div class="container">
<p>
Not on the list? Add it here.
</p>
<p>
<input id=#username value="default"/>
<input id=#email_address value="default@def.ault/>
<input type="button" value="Add" onclick={_ -> add_user()} />
</p>
</div>
)
list_db()=
(
List.map(
users -> <tr> <th>{users.name}</th> <th><input type="checkbox" id=#{users.md5sum} onclick={_ -> is_achy(users.md5sum)}/></th></tr>, StringMap.To.val_list(/users)
)
)
add_user() =
(
name = Dom.get_value(#username)
md5sum = Crypto.Hash.md5(name)
email = Dom.get_value(#email_address)
if name != "" then
do /users[md5sum] <- {~md5sum ~name ~email is_achy=false}
Dom.transform([{Dom.select_body()} <- setup_page()])
)
is_achy(md5sum) =
(
/users[md5sum]/is_achy <- Dom.is_checked(Dom.select_id(md5sum))
)
server = one_page_server("Achy head?", setup_page)
答案 0 :(得分:1)
我的假设是,您感到不安的是电子邮件在源中可见,就像您正在显示的所有其他数据一样,因此他们最终会在客户端上结束并不奇怪。 / p>
为什么电子邮件会发送到客户端?我认为将list_db
函数标记为服务器端会解决这个问题,但实际情况并非如此,说实话,我不确定原因。我将不得不做更多的挖掘或尝试让人比我更了解情况。一个简单的(虽然不是很令人满意)解决方法是创建一个函数,将user
类型投影到浏览器中呈现所需的内容并在服务器上进行此投影。它可能看起来像这样:
@server users_data() =
(
StringMap.map(user -> {md5sum=user.md5sum; name=user.name; is_achy=user.is_achy}, /users)
|> StringMap.To.val_list
)
list_db()=
(
render_user(user) =
<tr>
<th>{user.name}</th>
<th><input type="checkbox" id=#{user.md5sum} onclick={_ -> is_achy(user.md5sum)}/></th>
</tr>
List.map(render_user, users_data())
)
您将看到现在电子邮件不会“泄漏”到客户端。我会试着想出一个更好的答案......