zoukankan      html  css  js  c++  java
  • (七)play之yabe项目【CRUD】

     增加CRUD功能

    使用CRUD能干嘛?---->

    在页面对模型进行增删改查操作,这样有什么实际意义呢?

    不使用CRUD模块的功能,只要模型继承了Model类,就有save(),delete()等方法可以调用了

    这个CRUD对开发有什么帮助?

      用于快速生成一个基本的管理区域,如初始化一个登陆用户,很方便。

    到目前为止,我对CRUD功能的理解只能这样:

    提供一个可视化的对象管理界面,就好比数据库的客户端,play在后台执行SQL为我们处理数据

    而我们可以在页面进行增删改查的操作,不用再写增删改查的代码了!

    为了使用CRUD功能,需要导入play的CRUD依赖

    修改yabeconfdependencies.yml

    在require后面添加依赖的模块

    Html代码  收藏代码
    1. # Application dependencies  
    2.   
    3. require:  
    4.     - play -> crud  

    注意:dependencies文件中不能使用TAB键,只能使用空格键!!!!!!

     运行dependencies命令,安装模块



     

     为CRUD模块添加路由

    这条路由将把所有CRUD内建路由导入到/admin为前缀的URL路径中

    Html代码  收藏代码
    1. #import CRUD module  
    2. *       /admin              module:crud  

     刷新eclipse工程,可看到新增了一个modules文件夹,其下放了一个crud的文件

    该文件存放了一个路径,指向了本地play解压目录中的modulescrud文件夹

    E: echnology-hqhsoftplay-1.2.5modulescrud

    要想将模块导入,还需要重新执行eclipsify命令

    E: echnology-hqhprojplay-frameworkyabe>play eclipsify

    刷新工程,这时模块才真正被导入到IDE中,项目中才能找到CRUD这个类!

    声明模型所对应的控制器

    按照默认约定,控制器的名称为对应模型的复数形式,如User--->Users

     当然,也可以自定义名称,只需要使用注解标明这个控制器对应的模型即可

    但是,一般还是用默认的算了!呵呵,没那么多精力去研究,先跟着例子跑一遍再说!

    User实体类对应的控制器

    Java代码  收藏代码
    1. package controllers;  
    2.   
    3. public class Users extends CRUD {  
    4.   
    5. }  

     Post实体类对应的控制器

    Java代码  收藏代码
    1. package controllers;  
    2.   
    3. public class Posts extends CRUD {  
    4.   
    5. }  

     Comment实体类对应的控制器

    Java代码  收藏代码
    1. package controllers;  
    2.   
    3.   
    4. public class Comments extends CRUD {  
    5.   
    6. }  

    打开http://localhost:9000/admin/,即可看到系统中所有声明控制器的实体对象了



     

    点击User实体,可以查看当前的对象

    这些User对象看起来有点不友好,只有一个简单的序号(id?)来区分,可以对其进行定制

     

    在User实体中复写toString()

    Java代码  收藏代码
    1. @Override  
    2. public String toString() {  
    3.        return "User [" + fullname + "]";      
    4. }  

     刷新页面



     

     为模型添加验证

     既然可以在页面操作对象了,对应的数据校验功能也不可少

    使用play,对字段进行校验,只需要使用注解即可,连javascript都不用写

    得益于play.data.validation.*这个包下的东东!

    对User类的email字段和password进行验证

    Java代码  收藏代码
    1. package models;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5.   
    6. import javax.persistence.Entity;  
    7. import javax.persistence.OneToMany;  
    8.   
    9. import play.data.validation.Email;  
    10. import play.data.validation.Required;  
    11. import play.db.jpa.Model;  
    12.   
    13. @Entity  
    14. public class User extends Model {  
    15.       
    16.     @Email  
    17.     @Required  
    18.     public String email;  
    19.       
    20.     @Required(message="input your pwd now!")  
    21.     public String password;  
    22.       
    23.     public String fullname;  
    24.       
    25.     public boolean isAdmin;  
    26.       
    27.     //@OneToMany 声明User与Post之间是1对多的关系  
    28.     //mappedBy="author" 表示将通过对方(User)的author字段来进行关联关系的维护  
    29.     @OneToMany(mappedBy="author")  
    30.     public List<Post> posts;  
    31.       
    32.       
    33.     public User(String email,String password, String fullname) {  
    34.         this.email = email;  
    35.         this.password = password;  
    36.         this.fullname = fullname;  
    37.         this.posts = new ArrayList<Post>(0);  
    38.     }  
    39.       
    40.     /** 
    41.      * 联合email和password两个条件查询User 
    42.      * @param email 
    43.      * @param password 
    44.      * @return 
    45.      */  
    46.     public static User connect(String email, String password) {  
    47.         return find("byEmailAndPassword", email, password).first();  
    48.     }  
    49.       
    50.     /** 
    51.      * 添加Post的动作放到User中,这样可以把Post设置到User的List<Post>集合中 
    52.      * 这样实现了双方都持有对方的引用了 
    53.      * @param title 
    54.      * @param content 
    55.      * @return 
    56.      */  
    57.     public User addPost(String title, String content) {  
    58.         Post post = new Post(title,content,this).save();  
    59.         this.posts.add(post);  
    60.         this.save();  
    61.         return this;  
    62.     }  
    63.   
    64.     @Override  
    65.     public String toString() {  
    66.         return "User [" + fullname + "]";  
    67.     }  
    68.       
    69.       
    70.       
    71. }  

     什么都不输,保存一个User对象

    会提示错误信息到页面的,play真实个大好人啊,什么活都给干了!

     

    为Post实体加入验证

    Java代码  收藏代码
    1. package models;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.Date;  
    5. import java.util.List;  
    6.   
    7. import javax.persistence.CascadeType;  
    8. import javax.persistence.Entity;  
    9. import javax.persistence.Lob;  
    10. import javax.persistence.ManyToOne;  
    11. import javax.persistence.OneToMany;  
    12.   
    13. import play.data.validation.MaxSize;  
    14. import play.data.validation.Required;  
    15. import play.db.jpa.Model;  
    16.   
    17. @Entity  
    18. public class Post extends Model {  
    19.       
    20.     @Required  
    21.     public String title;  
    22.       
    23.     @Required  
    24.     public Date postedAt;  
    25.       
    26.     //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容  
    27.     @Lob  
    28.     @Required  
    29.     @MaxSize(100000000)  
    30.     public String content;  
    31.       
    32.     //@ManyToOne:声明Post与User之间是多对一的关系  
    33.     //一个用户可以发布多个博客,一个博客只能被一个用户所发布  
    34.     @Required  
    35.     @ManyToOne  
    36.     public User author;  
    37.       
    38.     //1篇博客对应多个评论  
    39.     //删除某篇博客,则级联删除其评论  
    40.     @OneToMany(mappedBy="post", cascade=CascadeType.ALL)  
    41.     public List<Comment> comments;  
    42.       
    43.     public Post() {  
    44.         System.out.println("create Post");  
    45.         this.postedAt = new Date();  
    46.     }  
    47.   
    48.     public Post(String title, String content, User author) {  
    49.         this.comments = new ArrayList<Comment>(0);  
    50.         this.title = title;  
    51.         this.content = content;  
    52.         this.author = author;  
    53.         this.postedAt = new Date();  
    54.     }  
    55.       
    56.     /** 
    57.      * 在Post中实现评论的添加保存操作 
    58.      * 同时更新Post所持有的Comment的集合! 
    59.      */  
    60.     public Post addComment(String author, String content) {  
    61.         //保存对方  
    62.         Comment newComment = new Comment(author, content, this).save();  
    63.         //把对方加入到自己管理的集合中  
    64.         this.comments.add(newComment);  
    65.         //同步到数据库  
    66.         this.save();  
    67.         return this;  
    68.     }  
    69.       
    70.       
    71.     /** 
    72.      * 前一篇博文 
    73.      */  
    74.     public Post previous() {  
    75.         return Post.find("postedAt < ? order by postedAt desc", postedAt).first();  
    76.     }  
    77.       
    78.     /** 
    79.      * 后一篇博文 
    80.      */  
    81.     public Post next() {  
    82.         return Post.find("postedAt > ? order by postedAt asc", postedAt).first();  
    83.     }  
    84. }  

     注意:使用CRUD在页面操作,对象的创建过程:

    1.调用默认构造函数生成一个对象

    2.查询数据库,把数据赋值到这个对象

    3.页面呈现此对象的相关属性

    如果在页面新创建一个对象,则不会查询数据库

    1.调用默认构造函数生成一个对象

    2.为对象赋值(如果默认构造函数中有这样做)

    3.页面呈现各个字段为空的对象,如果有为字段设置默认值,可在默认构造函数中操作

    4.页面输入数据,保存对象

    这里想说的是:对于createTime这样的字段值,一般是后台new Date()创建的,在页面使用CRUD貌似还不能对其进行控制,因为页面会呈现这个字段出现让用户输入(是否可以通过js控制其disabled状态呢?)暂时有这样一个疑问!有人知否?或者play提供了禁止编辑的注解,是什么???

    通过message转换窗体显示的Label

    yabeconfmessages中加入需要转换的字符串

    play会自动将页面显示的字符进行替换

    Xml代码  收藏代码
    1. # You can specialize this file for each language.  
    2. # For example, for French create a messages.fr file  
    3. #  
    4. title=Title    
    5.   
    6. content=Content   
    7.   
    8. postedAt=Posted at   
    9.   
    10. author=Author    
    11.   
    12. post=Related post   
    13.   
    14. tags=Tags set   
    15.   
    16. name=Common name   
    17.   
    18. email=Email    
    19.   
    20. password=Password   
    21.   
    22. fullname=Full name   
    23.   
    24. isAdmin=User is admin   

     原始的页面


     
     

    转换后的页面

      

     

  • 相关阅读:
    nginx的tcp/udp代理
    centos7的systemd服务详解
    centos7下ssh服务登陆认证详解
    laravel实现敏感词汇过滤
    laravel使用阿里云短信发送消息
    laravel中使用极光推送消息
    gitlab与jenkins结合构建持续集成
    gitlab的安装配置与简单使用
    centos7之firewalld防火墙的配置与使用
    使用码云,GitHub进行版本控制,并通过WebHook进行自动部署
  • 原文地址:https://www.cnblogs.com/zhiji6/p/4445049.html
Copyright © 2011-2022 走看看