opa:通过表单询问用户详细信息并将其保存到数据库

时间:2011-10-31 11:18:58

标签: database forms opa

如何向用户询问一些数据(某些字段可以在以后修改),将其存储在数据库中,然后向网站用户显示一些收集的数据,以便所有数据库内容都不会在页面源代码?

这是一个完整的示例,在页面重新加载后,所有数据都在页面源中可见:

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)

1 个答案:

答案 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())
)

您将看到现在电子邮件不会“泄漏”到客户端。我会试着想出一个更好的答案......