SlideShare una empresa de Scribd logo
1 de 61
Descargar para leer sin conexión
Limodou@gmail.com
2011年11月27日
 Zope 2 2000.4 pyrecord.freezope.net,评论与翻译
 PyBlosxom 2004.9 Blog程序,补丁未接受
 Snakelets 2004.10 源码学习
 Karrigell 2005.3年 源码学习
 CherryPy 2005.3源码学习
 Django 2005.7 贡献代码, db_dump
 Web2py 2008.3 贡献代码
 GAE 2008.4 制做网站,包括Uliwebproject网站
 Uliweb 2008.5
初识
Uliweb
Uliweb是
MVT型框架
WSGI
Web Server
(Apache, Nginx)
请求
应答
静态文件
Dispatcher WSGI
StaticFilesMiddleware WSGI
DebugApplication WSGI
静态文件处理,
需加入staticfiles app
静态文件
调试界面
URL 处理
Middleware 处理
View 处理 模板处理
业务处理
Request
&
Response
View
Template
TestProject
App1 App2 uliweb.contr
ib.staticfiles
uliweb.contr
ib.orm
static templates
apps
settings.ini views.py models.py
settings.ini
 安装:
>svn co http://uliweb.googlecode.com/svn/trunk/ uliweb
>setup.py develop
 Demo
>uliweb makeproject TestProject
>cd TestProject
>uliweb makeapp Hello
>uliweb runserver
访问 http://localhost:8000
创建APP
(makeapp name)
编辑views.py
设定URL
编写View代码
设计Template ORM处理 Form处理
功能性开发
修改settings.ini
配置apps
其它的参数
dispatch处理
配置性开发
开发服务器
uliweb runserver
or
uliweb develop
进阶
Uliweb
外部模块
Werkzeug
SqlAlchemy
SimpleJson(2.6自带)
Werkzeug
作者:Armin Ronacher
作品:Jinjia, Flask, pygments,
Zine,Sphinx
在Uliweb中的应用:
 Request, Response
 Dispatcher
 URL处理(expose, url_for)
 DebugApplication
 StaticFilesMiddleware
 命令行处理结构
 开发服务器,自动重启(我做了优化,可以识别象ini的变化)
SqlAlchemy (Michael Bayer:
Mako)
在Uliweb中的应用
 ORM
 orm模块
 uliweb.contrib.orm APP
开始
Manage.py中执行make_application()传入apps_dir
和include_apps等参数
SimpleFrame.py初始化Dispatcher类
Dispatcher:根据settings.ini和include_apps获得
所有app的列表,保存为self.apps
Dispatcher:根据self.apps,收集所有的
settings.ini和views*.py文件(views*.py并不导
入)
Dispatcher:根据settings列表,依次导入
settings.ini到settings对象中。同时
apps/settings.ini最后导入
Dispatcher:导入所有app(即调用所有
app/__init__.py),激活app的初始化处理
Dispatcher:导入所有view*.py文件,收集expose中
定义的URL
结束
settings.ini
#coding=UTF-8
[GLOBAL]
DEBUG = True
INSTALLED_APPS = [
'uliweb.contrib.staticfiles',
]
MIDDLEWARE_CLASSES = [
'uliweb.orm.middle_transaction.TransactionMiddle'
]
TIME_ZONE = 'UTC'
Model
class Requirement(Model):
req_id = Field(CHAR, verbose_name='编号', max_length=12,
required=True, unique=True, index=True)
year = Field(int, verbose_name='年度', required=True,
choices=get_var('PARA/YEAR'), index=True,
default=lambda :datetime.date.today().year)
title = Field(str, verbose_name='标题', max_length=255, required=True)
description = Field(TEXT, verbose_name='描述')
begin_date = Field(datetime.date, verbose_name='阶段开始时间')
creator = Reference('user', verbose_name='创建者',
collection_name='creator_requirements')
created_date = Field(datetime.date, verbose_name='创建时间',
auto_now_add=True)
systems = ManyToMany('system', verbose_name='执行系统',
collection_name='sys_requirements')
class User(Model):
username = Field(CHAR, max_length=20)
year = Field(int)
user = User(username='limodou', year=36)
user.save()
user = User.get(5)
user = User.get(User.c.id==5)
user.uesrname = 'user‘
user.save()
user.delete()
User.all()
User.filter(User.c.year > 18)
User.all().filter(User.c.year>18).count()
User.delete(User.c.year<18)
User.count(User.c.year<18)
apps/settings.ini
[ORM]
CONNECTION = 'sqlite:///database.db'
DEBUG_LOG = False
uliweb/contrib/orm/settings.ini
[ORM]
DEBUG_LOG = False
AUTO_CREATE = True
CONNECTION = 'sqlite://'
Uliweb ORM
可以自动建表
不喜欢Uliweb ORM?
发挥你的创造性吧!
View
#coding=utf-8
from uliweb import expose
@expose('/')
def index():
return '<h1>Hello, Uliweb</h1>'
@expose(‘/static/<path:filename>’)
@expose(‘/archieve/<int:year>/<int:m
on>’)
@expose(‘/user/<username>’)
@expose(‘/page’, default={‘pageno’:1})
@GET(‘/user/<username>’)
@POST(‘/user/<username>/save’)
 参数与expose中定义的一致,如:
@expose(‘/’)
def index():
return {}
@expose(‘/user/<username>’)
def user_view(username):
return {}
字典,根据view函数名,自动
套动模板(来源于web2py)
Response对象,直接返回
其它对象,使用str(obj)处理后,
转换为Response返回
 在直接View函数中有一些可以直接使用的全局变
量:
 request, response, application, settings, error,
redirect, json等
 当在非直接View函数中想使用时,可以:
import uliweb
uliweb.request
或
from uliweb import request
 模板中
{{=url_for(‘Hello.views.index’)}} == ‘/index’
 View函数中
url_for(‘Hello.views.index’)
url_for(index)
 参数传递
url_for(‘index’, pageno=0)
Template
{{=var}}
{{python code}}
{{<< htmlcode}}
{{if user=='admin':}}
<p>Welcome</p>
{{else:}}
<a href="/login">Login</a>
{{pass}}
{{block content}}<div>default content</div>{{end}}
{{embed var}}
{{include “template.html”}}
高阶
Uliweb
 config.ini
[DEFAULT]
REQUIRED_APPS = ['uliweb.contrib.staticfiles',
'uliweb.contrib.template']
 sql 显示建表时的sql语句
 reset 重建表
 dump 卸出数据
 load 装入数据
 syncdb 自动创建表
 dbinit 执行初始化脚本
 配置:settings.ini
[MODELS]
system = 'systems.models.System‘
 导入:
from uliweb.orm import get_model
system = get_model(‘system’)
可以将view方法拆分为:
views_xx.py, views_yy.py
或放在views目录下的xx.py, yy.py
__begin__
&
__end__
 模块:uliweb.core.dispatch
 方法:
bind, call, get
 示例
dispatch.call(self.__class__, 'post_save', instance=self,
created=created, data=old, old_data=self._old_values)
@dispatch.bind(‘post_save’)
def post_save(sender, instance, created, data, old_data):
print sender, instance, created, data, old_data
 配置(settings.ini INSTALLED_APPS)
‘uliweb.contrib.template’
 模板语法
{{use “jquery”}}
{{link “jquery.1.4.4.js”}}
@expose(‘/index’, name=‘index’)
url_for(‘index’)
静态文件处理
uliweb exportstitic
i18n处理
 代码中:
from uliweb.i18n import ugettext_lazy as _
_('Save')
 模板中:
{{=_(‘Save’)}}
 命令行
i18n:
extract i18n message catalog form app or all apps
-a, --appname string
--project
--apps
--core
-l, --locale string en
 Settings.ini
[I18N]
LANGUAGE_CODE = 'en‘
 其它
支持LazyTranslate
支持从浏览器的HTTP头判断需要的语言种类
总结
目标
最大可能的提高复用性
分布式结构,集中使用
编写尽可能简单
创建易于使用的app
鼓励把Uliweb作为二次开发平台
特点
 分布式结构,集中视图,工具辅助
 App方式的项目组织方式
 每个app相对完整,可以包括:静态资源,模板,配置
 使用上,静态资源,模板,配置是一个整体
 App有依赖功能
 功能完整:MVT, i18n, auth, cache, session等
 提供功能相对完整的ORM,并且orm可配置化
 View方法可以自动套用模板
 request, response,application, settings等可以直接在view方
法中使用,也可能导入使用
 模板可以嵌入python代码,不用关心缩近,只要处理好
pass
 Use,link Tag
 url采用类正则式方式,更容易写。并提供命名方式和反向
url功能
我做了什么?
 SimpleFrame
 Dispatch
 Template(修改)
 Weto(cache, session)
 I18n
 ORM
 Form
 Generic
 pyini
相关资源
 项目主页: http://code.google.com/p/uliweb
 参考项目: http://code.google.com/p/weflow
 宣传网站: http://uliwebproject.appspot.com
 入门文档: 《Learning Uliweb》
FAQ

Más contenido relacionado

La actualidad más candente

Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practicelitaocheng
 
中纺科技安装实施文档
中纺科技安装实施文档中纺科技安装实施文档
中纺科技安装实施文档liangsuilong
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringJustin Lin
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
GNU Autoconf / Automake #1
GNU Autoconf / Automake #1GNU Autoconf / Automake #1
GNU Autoconf / Automake #1imacat .
 
Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Chu-Siang Lai
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmiyiditushe
 
GNU Autoconf / Automake #4
GNU Autoconf / Automake #4GNU Autoconf / Automake #4
GNU Autoconf / Automake #4imacat .
 
Uliweb设计分享
Uliweb设计分享Uliweb设计分享
Uliweb设计分享modou li
 
Spring 2.0 技術手冊第二章 - Spring 入門
Spring 2.0 技術手冊第二章 - Spring 入門Spring 2.0 技術手冊第二章 - Spring 入門
Spring 2.0 技術手冊第二章 - Spring 入門Justin Lin
 
Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend frameworkthinkinlamp
 
Django
DjangoDjango
DjangoTao He
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniterBo-Yi Wu
 

La actualidad más candente (20)

RESTful API Design
RESTful API DesignRESTful API Design
RESTful API Design
 
Osgi Intro
Osgi IntroOsgi Intro
Osgi Intro
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practice
 
中纺科技安装实施文档
中纺科技安装实施文档中纺科技安装实施文档
中纺科技安装实施文档
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
GNU Autoconf / Automake #1
GNU Autoconf / Automake #1GNU Autoconf / Automake #1
GNU Autoconf / Automake #1
 
Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmi
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
GNU Autoconf / Automake #4
GNU Autoconf / Automake #4GNU Autoconf / Automake #4
GNU Autoconf / Automake #4
 
Uliweb设计分享
Uliweb设计分享Uliweb设计分享
Uliweb设计分享
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
Spring 2.0 技術手冊第二章 - Spring 入門
Spring 2.0 技術手冊第二章 - Spring 入門Spring 2.0 技術手冊第二章 - Spring 入門
Spring 2.0 技術手冊第二章 - Spring 入門
 
Php
Php Php
Php
 
Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend framework
 
Django
DjangoDjango
Django
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
 

Destacado

Python面向对象开发基础篇
Python面向对象开发基础篇Python面向对象开发基础篇
Python面向对象开发基础篇modou li
 
01.uliweb介绍
01.uliweb介绍01.uliweb介绍
01.uliweb介绍modou li
 
04.uliweb更多话题介绍
04.uliweb更多话题介绍04.uliweb更多话题介绍
04.uliweb更多话题介绍modou li
 
02.python基础
02.python基础02.python基础
02.python基础modou li
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013modou li
 
03.python工作环境
03.python工作环境03.python工作环境
03.python工作环境modou li
 
Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1modou li
 
03.uliweb开发进阶
03.uliweb开发进阶03.uliweb开发进阶
03.uliweb开发进阶modou li
 
01.python介绍
01.python介绍01.python介绍
01.python介绍modou li
 
Uliweb 快速易用的Python Web Framework
Uliweb 快速易用的Python Web FrameworkUliweb 快速易用的Python Web Framework
Uliweb 快速易用的Python Web Frameworkmodou li
 
02.uliweb开发入门
02.uliweb开发入门02.uliweb开发入门
02.uliweb开发入门modou li
 
Algebra I Warm-ups
Algebra I Warm-upsAlgebra I Warm-ups
Algebra I Warm-upsguest3ce8ee0
 
Or Sam Opiates &amp; Opioids 04 19 2011
Or Sam Opiates &amp; Opioids 04 19 2011Or Sam Opiates &amp; Opioids 04 19 2011
Or Sam Opiates &amp; Opioids 04 19 2011bardlomlarry
 
Pregnancy with beta thalassemia
Pregnancy with beta thalassemiaPregnancy with beta thalassemia
Pregnancy with beta thalassemiamamuni00g2
 
MANAGEMENT OF HYPEREMESIS GRAVIDARUM
    MANAGEMENT OF HYPEREMESIS GRAVIDARUM    MANAGEMENT OF HYPEREMESIS GRAVIDARUM
MANAGEMENT OF HYPEREMESIS GRAVIDARUMmamuni00g2
 
HR practices in infosys
HR practices in infosysHR practices in infosys
HR practices in infosysBhasker Rajan
 
Stratégie digital-cci-rennes-btob-btoc-2013
Stratégie digital-cci-rennes-btob-btoc-2013Stratégie digital-cci-rennes-btob-btoc-2013
Stratégie digital-cci-rennes-btob-btoc-2013Gregoire Lockhart
 
"Génération Y, de A à Z" par MEC Paris
"Génération Y, de A à Z" par MEC Paris"Génération Y, de A à Z" par MEC Paris
"Génération Y, de A à Z" par MEC ParisagenceMEC
 

Destacado (20)

Python面向对象开发基础篇
Python面向对象开发基础篇Python面向对象开发基础篇
Python面向对象开发基础篇
 
01.uliweb介绍
01.uliweb介绍01.uliweb介绍
01.uliweb介绍
 
04.uliweb更多话题介绍
04.uliweb更多话题介绍04.uliweb更多话题介绍
04.uliweb更多话题介绍
 
02.python基础
02.python基础02.python基础
02.python基础
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013
 
03.python工作环境
03.python工作环境03.python工作环境
03.python工作环境
 
Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1
 
03.uliweb开发进阶
03.uliweb开发进阶03.uliweb开发进阶
03.uliweb开发进阶
 
01.python介绍
01.python介绍01.python介绍
01.python介绍
 
Uliweb 快速易用的Python Web Framework
Uliweb 快速易用的Python Web FrameworkUliweb 快速易用的Python Web Framework
Uliweb 快速易用的Python Web Framework
 
02.uliweb开发入门
02.uliweb开发入门02.uliweb开发入门
02.uliweb开发入门
 
Algebra I Warm-ups
Algebra I Warm-upsAlgebra I Warm-ups
Algebra I Warm-ups
 
Or Sam Opiates &amp; Opioids 04 19 2011
Or Sam Opiates &amp; Opioids 04 19 2011Or Sam Opiates &amp; Opioids 04 19 2011
Or Sam Opiates &amp; Opioids 04 19 2011
 
Pregnancy with beta thalassemia
Pregnancy with beta thalassemiaPregnancy with beta thalassemia
Pregnancy with beta thalassemia
 
MANAGEMENT OF HYPEREMESIS GRAVIDARUM
    MANAGEMENT OF HYPEREMESIS GRAVIDARUM    MANAGEMENT OF HYPEREMESIS GRAVIDARUM
MANAGEMENT OF HYPEREMESIS GRAVIDARUM
 
Loreal case study
Loreal case studyLoreal case study
Loreal case study
 
HR practices in infosys
HR practices in infosysHR practices in infosys
HR practices in infosys
 
Programme du PLFI 2013
Programme du PLFI 2013 Programme du PLFI 2013
Programme du PLFI 2013
 
Stratégie digital-cci-rennes-btob-btoc-2013
Stratégie digital-cci-rennes-btob-btoc-2013Stratégie digital-cci-rennes-btob-btoc-2013
Stratégie digital-cci-rennes-btob-btoc-2013
 
"Génération Y, de A à Z" par MEC Paris
"Génération Y, de A à Z" par MEC Paris"Génération Y, de A à Z" par MEC Paris
"Génération Y, de A à Z" par MEC Paris
 

Similar a Uliweb框架思想与编程

Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Workshop Sutdio3(1)
Workshop Sutdio3(1)Workshop Sutdio3(1)
Workshop Sutdio3(1)wangjiaz
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Servicesjavatwo2011
 
一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)Kejun Zhang
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料yiditushe
 
Node js实践
Node js实践Node js实践
Node js实践myzykj
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导yiditushe
 
Java 1(Java概述)
Java 1(Java概述)Java 1(Java概述)
Java 1(Java概述)xzdbd
 
JQuery 学习
JQuery 学习JQuery 学习
JQuery 学习cssrain
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Joseph Chiang
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0Anthony Chen
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發koji lin
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 

Similar a Uliweb框架思想与编程 (20)

Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Workshop Sutdio3(1)
Workshop Sutdio3(1)Workshop Sutdio3(1)
Workshop Sutdio3(1)
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
Structs2簡介
Structs2簡介 Structs2簡介
Structs2簡介
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Node js实践
Node js实践Node js实践
Node js实践
 
A
AA
A
 
A
AA
A
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导
 
Java 1(Java概述)
Java 1(Java概述)Java 1(Java概述)
Java 1(Java概述)
 
JQuery 学习
JQuery 学习JQuery 学习
JQuery 学习
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
 
2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 

Uliweb框架思想与编程