这是用.net2.0开发的一个基于ExtSJ技术实现的简单blog系统,演示了ExtJS的综合应用。
  系统后台使用.Net平台,语言为C#,技术构架为NHibernate+Spring.Net+Vifir实现,支持多种数据库,采用三层结构,数据访问层DAO、业务逻辑层及表示层完全分离。DAO层使用的泛型DAO,只需要一个DAO接口即可,不需要写具体的实现。
  系统演示:
  下面是系统后台的截图
  
  (登录)
   系统中的一些源码摘要:
域模型:
namespace Vifir.Model.Domain
{
   
public class Topic
    
{
        
private long id;
        
        
private string title;      

        
private string content;
        
        
private string intro;       

        
private TopicCategory category;       

        
private IList<TopicComment> comments = new List<TopicComment>();

       
private DateTime inputTime = DateTime.Now;
       
        
private int readTimes = 0;
       
public virtual long Id
        
{
            
get return id; }
            
set { id = value; }
        }

       
public virtual string Title
        
{
            
get return title; }
            
set { title = value; }
        }

       
public virtual string Content
        
{
            
get return content; }
            
set { content = value; }
        }

       
public virtual string Intro
        
{
            
get return intro; }
            
set { intro = value; }
        }

       
public virtual TopicCategory Category
        
{
            
get return category; }
            
set { category = value; }
        }

       
public virtual IList<TopicComment> Comments
        
{
            
get return comments; }
            
set { comments = value; }
        }

       
public virtual DateTime InputTime
        
{
            
get return inputTime; }
            
set { inputTime = value; }
        }

       
public virtual int ReadTimes
        
{
            
get return readTimes; }
            
set { readTimes = value; }
        }

    }

}


DAO接口
namespace Vifir.Model.DAO
{
    
public interface ITopicDAO : GenericDAO
    
{
    }

}
泛型DAO配置 
< object  id = " TopicDao "  parent = " abstractDao " >      < property name = " proxyInterfaces "
 value = " Vifir.Model.DAO.ITopicDAO " />      < property name = " target " >      
  < object  parent = " baseDAO "  type = " Vifir.Core.GenericDAOImpl&lt;Vifir.Model.Domain.Topic>,Vifir.Core "   />     
</ property >    </ object >
TopicService业务层实现代码
namespace Vifir.Model.Service.Impl
{
    
public class TopicServiceImpl:ITopicService
    
{
            
private ITopicDAO topicDao;

    
public ITopicDAO TopicDao
    
{
      
set { topicDao = value; }
    }

    

    
public long addTopic(Topic topic) {    
        
this.topicDao.Save(topic);
        
return topic.Id;
    }

    
    
public Topic getTopic(long id) {
        Topic topic 
= this.topicDao.Get(id);
        
return topic;
        }

    
    
public bool delTopic(long id) {    
            Topic topic 
= this.getTopic(id);
            
if(topic.Comments.Count>0)throw new LogicException("该文章下还有评论,不能删除!");
            
if (topic != null{
                
this.topicDao.Remove(id);
                
return true;
            }
            
            
return false;    
    }

    
    
    
public IPageList getTopicBy(IQueryObject queryObject) {    
        
return QueryUtil.query(queryObject, typeof(Topic),this.topicDao);        
    }

    
    
public bool updateTopic(long id, Topic topic) {
        
if (id != default(long))
        
{
            topic.Id
=id;
        }
 else {
            
return false;
        }

        
this.topicDao.Update(topic);
        
return true;
    }
    
    }

}


Web层的添删改查代码:public partial class manage_Topic : BaseAction
{
    
private ITopicService service;   
    
private ITopicCategoryService categoryService;
    
public ITopicService Service
    
{
        
set { service = value; }
    }

    
public ITopicCategoryService CategoryService
    
{  
        
set { categoryService = value; }
    }


    
public void List()
    
{
        QueryObject qo 
= new QueryObject();
        ToPo(qo);
        
string categoryId = Request.Params["categoryId"];
        
if (categoryId != null && !"".Equals(categoryId))
        
{
            qo.addQuery(
"obj.Category.id"long.Parse(categoryId), "=");
        }

        IPageList pageList 
= service.getTopicBy(qo);
        jsonResult 
= pageList;
    }


    
public void Remove()
    
{
        
long id = long.Parse(Request.Params["id"]);
        service.delTopic(id);
        jsonResult 
= true;
    }


    
public void Save()
    
{
       Topic obj 
= new Topic();
       ToPo(obj);
       
string CategoryId = Request.Params["CategoryId"];
       
if (CategoryId != null && !"".Equals(CategoryId))
       
{
         TopicCategory c 
= this.categoryService.getTopicCategory(long.Parse(CategoryId));
         obj.Category 
= c;
       }

       
if (!HasError())
       service.addTopic(obj);
       extFormResult 
= true;
    }


    
public void Update()
    
{
        
long id = long.Parse(Request.Params["id"]);
        Topic obj 
= service.getTopic(id);
        ToPo(obj);
        
string CategoryId = Request.Params["CategoryId"];
        
if (CategoryId != null && !"".Equals(CategoryId))
        
{
            TopicCategory c 
= this.categoryService.getTopicCategory(long.Parse(CategoryId));
            obj.Category 
= c;
        }

        
if (!HasError())
            service.updateTopic(id, obj);
        extFormResult 
= true;
    }

}