从头到尾实现一个用TP开发的个人站点【二】
2017-12-20 09:39
363 查看
从这一章我们开始后台的开发,上一章我们说了先从栏目进行开始,那么,我们明确栏目了吗?
从上一章的截图得知栏目如下图:
大家要明确一个网站一般会有有哪些页面?
答:首页、列表页【文字列表、图片列表、图文列表】、内容页
我这个站的页面就是首页、列表页、内容页
根据以上图片的栏目显示除了展会新闻、行业新闻是列表页外,其他的都是单页
栏目需求明确后台,那么我先设计一下数据库
注先声明一点:我做的这个站点本来是中英双语的,教程是以中文为主
栏目表名:tp_channel表 字段如下
id ID自增
cname 栏目名称
keys 关键字
des 描述
is_list 是否列表 0:单页 1:列表 默认值是:0
thumb 缩略图
content 内容 【主要针对单页实现】
sort 排序
pid 父ID 默认值:0
数据表设计好,那么我们开始做后台的栏目开发了
第一步:把TP3.2.3解压在你的站点根目录中
第二步:在Application目录中添加一个Admin的目录,在Admin目录下再添加Controller和Model以及View目录,这个手动创建;
或者在跟目录下的index.php加上define('BIND_MODULE','Admin');这行代码,运行会自动创建Admin模块下的Controller、Model、View等等文件或者文件夹;切记生成后要把这代码删除或者注释掉
第三步:在Application\Admin\Controller目录下创建ChannelController.class.php文件【控制器】。每个功能都是有增删改查的。那么代码如下:
1、我们先来实现添加栏目功
bba1
能,先看一下效果图
注:效果图中的所属类型有参观登记、参展登记和外链,在此教程中我们是不做的,但是你们可以作为教程以外的练习,还有一点,在我的项目当中都是以ajax进行数据传输,这块我就不多说了。现在的教程都是以后端实现为主,很少降到前端的知识。
栏目添加功能的代码如下:
// 添加栏目
public function add(){
if(IS_POST){
$data = I('post.');
if(!$data['cname']){
return show(0, '栏目名称不能为空');
}
$data['lang'] = $_SESSION['adminUser']['lang'];//这个是登录的时候判断是中文,还是英文
$res = D('Channel')->addChannel($data);//自定义的一个模型进行数据
if($res){
return show(1,'添加成功');
}else{
return show(0,'添加失败');
}
}else{
$where = array('lang'=>$_SESSION['adminUser']['lang']);
$list = D('Channel')->getAllChannel($where);
vendor('Tree.Category');//这个是我自己写了一个树形类文件
$cate = new \Category;
$cate = $cate->unlimitedForLevelSelect($list);
$this->assign('list',$cate);
$this->display();
}
那么我们的模型放在那里呢?
相信很多人都是独立模块放在独立模块中,例如:Admin\Model\目录下写相关的模型
但是,我个人的想法是这样的,前后台都是要用到向对应的模型,所以,我会把模型放到Application\Common目录下创建一个Model模型目录
在Application\Common\Model下创建ChannelModel.class.php模型文件,代码如下:
<?php
/**
* @Author: 穆沂华
* @Date: 2017/10/6 23:12
* @Web: http://www.dengmuhua.cn * @Email: woody_deng@163.com
* @Last Modified by: 穆沂华
* @Last Modified time: 2017/10/6 23:12
*/
namespace Common\Model;
use Think\Model;
class ChannelModel extends Model {
private $_db = '';
public function __construct(){
$this->_db = M('channel');
}
/**
* @param $where 根据条件进行查找所有的栏目分类
*/
public function getAllChannel($where){
$res = $this->_db->where($where)->order('sort ASC')->select();
return $res;
}
/**
* 查询一条栏目数据
* @param $where 查询的条件
* @return mixed
*/
public function getOneChannel($where){
$res = $this->_db->where($where)->find();
return $res;
}
/**
* 添加栏目
* @param array $data 数据
*/
public function addChannel($data=array()){
if(!$data || !is_array($data)){
throw_exception('数据有误');
}
$res = $this->_db->add($data);
return $res;
}
/**
* 修改栏目
* @param array $data 更新的数据
* @param $where 更新的条件
* @return mixed
*/
public function editChannel($data=array(), $where){
if(!$data || !is_array($data)){
throw_exception('数据有误');
}
$res = $this->_db->where($where)->setField($data);
return $res;
}
/**
* 删除栏目
* @param $where
* @return mixed
*/
public function delChannel($where){
$res = $this->_db->where($where)->delete();
return $res;
}
}注:以上的代码已经包含了对数据库的增删改查,往后对应的栏目列表,修改,删除功能对应的模型就不贴代码了
2、栏目列表,效果图如下:
在控制器文件中添加如下代码【Application\Admin\Controller\ChannelController.class.php】
// 栏目列表
public function index(){
$where = array('lang'=>$_SESSION['adminUser']['lang']);
$list = D('Channel')->getAllChannel($where);
vendor('Tree.Category');
$cate = new \Category;
$cate = $cate->unlimitedForLevel($list);
$this->assign('list',$cate);
$this->display();
}
3、栏目修改,效果图如下:
在控制器上添加如下代码
// 修改栏目
public function edit(){
if(IS_POST){
$data = I('post.');
if(!is_numeric($data['id'])){
return show(0, 'ID不合法');
}
if(!$data['cname']){
return show(0, '栏目名称不能为空');
}
$where =array(
'id' => $data['id'],
'lang' => $_SESSION['adminUser']['lang']
);
$data = array(
'cname' => $data['cname'],
'thumb' => $data['thumb'],
'pid' => $data['pid'],
'is_list'=> $data['is_list']
);
$row = D('Channel')->editChannel($data, $where);
if($row){
return show(1,'修改成功');
}else{
return show(0,'修改失败');
}
}else{
$id = I('get.id');
$where['lang'] = $_SESSION['adminUser']['lang'];
$list = D('Channel')->getAllChannel($where);
vendor('Tree.Category');
$cate = new \Category;
$cate = $cate->unlimitedForLevelSelect($list);
$this->assign('list',$cate);
$where['id'] = $id;
$row = D('Channel')->getOneChannel($where);
$this->assign('info', $row);
$type = C('ISCHANNELTYPE');
$this->assign('type', $type);
$this->display();
}
}
注:在控制上的代码出现了show(),unlimitedForLevelSelect()等函数方法,这些是函数文件,以及类文件
show()方法的实现,在Aplication\Common\Common\function.php文件中,进行添加,代码如下:
/**
* 以json格式返回数据
* @param [type] $status 状态码 [description]
* @param [type] $message 提示信息 [description]
* @param array $data 数据 [description]
* @return [type] [description]
*/
function show($status, $message, $data=array()){
$result = array(
'status' => $status,
'message' => $message,
'data' => $data
);
exit(json_encode($result));
}
unlimitedForLevelSelect()的实现,是在ThinkPHP\Library\Vendor\Tree\Category.php,代码如下
<?php
/**
* 无限级分类递归方法类
* @Author: 穆沂华
* @Date: 2017/10/6 22:39
* @Web: http://www.dengmuhua.cn * @Email: woody_deng@163.com
* @Last Modified by: 穆沂华
* @Last Modified time: 2017/10/6 22:39
*/
class Category {
/**
* 组合一维数组[在添加选择]
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function unlimitedForLevelSelect1($cate, $html = '|--', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevelSelect1($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合一维数组[在添加选择]
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function unlimitedForLevelSelect($cate, $html = '├', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevelSelect($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合一维数组【在列表显示,专用于公司部门显示】
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function departmentLevel($cate, $html = '<img src="/Public/admin/img/line.gif">', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['parent_id'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::departmentLevel($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合一维数组【在列表显示】
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function unlimitedForLevel($cate, $html = '<img src="/Public/admin/img/line.gif">', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevel($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合多维数组
* @param [type] $cate [description]
* @param string $name [description]
* @param integer $pid [description]
* @return [type] [description]
*/
static public function unlimitedForLayer($cate, $name = 'child', $pid = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v[$name] = self::unlimitedForLayer($cate, $name, $v['id']);
$arr[] = $v;
}
}
return $arr;
}
/**
* 传递一个子分类返回所有的父级Id
* @param [type] $cate [description]
* @param [type] $id [description]
* @return [type] [description]
*/
static public function getParentsId($cate, $id){
$arr = array();
foreach ($cate as $v) {
if ($v['id'] == $id) {
$arr[] = $v['id'];
$arr = array_merge(self::getParentsId($cate, $v['pid']), $arr);
}
}
return $arr;
}
/**
* 传递一个子分类返回所有的父级分类
* @param [type] $cate [description]
* @param [type] $id [description]
* @return [type] [description]
*/
static public function getParents($cate, $id){
$arr = array();
foreach ($cate as $v) {
if ($v['id'] == $id) {
$arr[] = $v;
$arr = array_merge(self::getParents($cate, $v['pid']), $arr);
}
}
return $arr;
}
/**
* 传递一个父级分类返回所有的子级Id
* @param [type] $cate [description]
* @param [type] $pid [description]
* @return [type] [description]
*/
static public function getChildrenId($cate, $pid){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$arr[] = $v['id'];
$arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
}
}
return $arr;
}
/**
* 传递一个父级分类返回所有的子级分类
* @param [type] $cate [description]
* @param [type] $pid [description]
* @return [type] [description]
*/
static public function getChildren($cate, $pid){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$arr[] = $v;
$arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
}
}
return $arr;
}
}
以上的就是栏目的增删改查,还有一个删除的功能,留给你们自己完成
有什么不明白可以通过以下的方法进行沟通了解
QQ:2363536014
待续~~~~~
从上一章的截图得知栏目如下图:
大家要明确一个网站一般会有有哪些页面?
答:首页、列表页【文字列表、图片列表、图文列表】、内容页
我这个站的页面就是首页、列表页、内容页
根据以上图片的栏目显示除了展会新闻、行业新闻是列表页外,其他的都是单页
栏目需求明确后台,那么我先设计一下数据库
注先声明一点:我做的这个站点本来是中英双语的,教程是以中文为主
栏目表名:tp_channel表 字段如下
id ID自增
cname 栏目名称
keys 关键字
des 描述
is_list 是否列表 0:单页 1:列表 默认值是:0
thumb 缩略图
content 内容 【主要针对单页实现】
sort 排序
pid 父ID 默认值:0
数据表设计好,那么我们开始做后台的栏目开发了
第一步:把TP3.2.3解压在你的站点根目录中
第二步:在Application目录中添加一个Admin的目录,在Admin目录下再添加Controller和Model以及View目录,这个手动创建;
或者在跟目录下的index.php加上define('BIND_MODULE','Admin');这行代码,运行会自动创建Admin模块下的Controller、Model、View等等文件或者文件夹;切记生成后要把这代码删除或者注释掉
第三步:在Application\Admin\Controller目录下创建ChannelController.class.php文件【控制器】。每个功能都是有增删改查的。那么代码如下:
<?php namespace Admin\Controller; use Think\Controller; class ChannelController extends Controller{ // 列表 public function index(){
$this->display();
} // 添加 public function add(){} // 修改 public function edit(){} // 删除 public function del(){} }
1、我们先来实现添加栏目功
bba1
能,先看一下效果图
注:效果图中的所属类型有参观登记、参展登记和外链,在此教程中我们是不做的,但是你们可以作为教程以外的练习,还有一点,在我的项目当中都是以ajax进行数据传输,这块我就不多说了。现在的教程都是以后端实现为主,很少降到前端的知识。
栏目添加功能的代码如下:
// 添加栏目
public function add(){
if(IS_POST){
$data = I('post.');
if(!$data['cname']){
return show(0, '栏目名称不能为空');
}
$data['lang'] = $_SESSION['adminUser']['lang'];//这个是登录的时候判断是中文,还是英文
$res = D('Channel')->addChannel($data);//自定义的一个模型进行数据
if($res){
return show(1,'添加成功');
}else{
return show(0,'添加失败');
}
}else{
$where = array('lang'=>$_SESSION['adminUser']['lang']);
$list = D('Channel')->getAllChannel($where);
vendor('Tree.Category');//这个是我自己写了一个树形类文件
$cate = new \Category;
$cate = $cate->unlimitedForLevelSelect($list);
$this->assign('list',$cate);
$this->display();
}
那么我们的模型放在那里呢?
相信很多人都是独立模块放在独立模块中,例如:Admin\Model\目录下写相关的模型
但是,我个人的想法是这样的,前后台都是要用到向对应的模型,所以,我会把模型放到Application\Common目录下创建一个Model模型目录
在Application\Common\Model下创建ChannelModel.class.php模型文件,代码如下:
<?php
/**
* @Author: 穆沂华
* @Date: 2017/10/6 23:12
* @Web: http://www.dengmuhua.cn * @Email: woody_deng@163.com
* @Last Modified by: 穆沂华
* @Last Modified time: 2017/10/6 23:12
*/
namespace Common\Model;
use Think\Model;
class ChannelModel extends Model {
private $_db = '';
public function __construct(){
$this->_db = M('channel');
}
/**
* @param $where 根据条件进行查找所有的栏目分类
*/
public function getAllChannel($where){
$res = $this->_db->where($where)->order('sort ASC')->select();
return $res;
}
/**
* 查询一条栏目数据
* @param $where 查询的条件
* @return mixed
*/
public function getOneChannel($where){
$res = $this->_db->where($where)->find();
return $res;
}
/**
* 添加栏目
* @param array $data 数据
*/
public function addChannel($data=array()){
if(!$data || !is_array($data)){
throw_exception('数据有误');
}
$res = $this->_db->add($data);
return $res;
}
/**
* 修改栏目
* @param array $data 更新的数据
* @param $where 更新的条件
* @return mixed
*/
public function editChannel($data=array(), $where){
if(!$data || !is_array($data)){
throw_exception('数据有误');
}
$res = $this->_db->where($where)->setField($data);
return $res;
}
/**
* 删除栏目
* @param $where
* @return mixed
*/
public function delChannel($where){
$res = $this->_db->where($where)->delete();
return $res;
}
}注:以上的代码已经包含了对数据库的增删改查,往后对应的栏目列表,修改,删除功能对应的模型就不贴代码了
2、栏目列表,效果图如下:
在控制器文件中添加如下代码【Application\Admin\Controller\ChannelController.class.php】
// 栏目列表
public function index(){
$where = array('lang'=>$_SESSION['adminUser']['lang']);
$list = D('Channel')->getAllChannel($where);
vendor('Tree.Category');
$cate = new \Category;
$cate = $cate->unlimitedForLevel($list);
$this->assign('list',$cate);
$this->display();
}
3、栏目修改,效果图如下:
在控制器上添加如下代码
// 修改栏目
public function edit(){
if(IS_POST){
$data = I('post.');
if(!is_numeric($data['id'])){
return show(0, 'ID不合法');
}
if(!$data['cname']){
return show(0, '栏目名称不能为空');
}
$where =array(
'id' => $data['id'],
'lang' => $_SESSION['adminUser']['lang']
);
$data = array(
'cname' => $data['cname'],
'thumb' => $data['thumb'],
'pid' => $data['pid'],
'is_list'=> $data['is_list']
);
$row = D('Channel')->editChannel($data, $where);
if($row){
return show(1,'修改成功');
}else{
return show(0,'修改失败');
}
}else{
$id = I('get.id');
$where['lang'] = $_SESSION['adminUser']['lang'];
$list = D('Channel')->getAllChannel($where);
vendor('Tree.Category');
$cate = new \Category;
$cate = $cate->unlimitedForLevelSelect($list);
$this->assign('list',$cate);
$where['id'] = $id;
$row = D('Channel')->getOneChannel($where);
$this->assign('info', $row);
$type = C('ISCHANNELTYPE');
$this->assign('type', $type);
$this->display();
}
}
注:在控制上的代码出现了show(),unlimitedForLevelSelect()等函数方法,这些是函数文件,以及类文件
show()方法的实现,在Aplication\Common\Common\function.php文件中,进行添加,代码如下:
/**
* 以json格式返回数据
* @param [type] $status 状态码 [description]
* @param [type] $message 提示信息 [description]
* @param array $data 数据 [description]
* @return [type] [description]
*/
function show($status, $message, $data=array()){
$result = array(
'status' => $status,
'message' => $message,
'data' => $data
);
exit(json_encode($result));
}
unlimitedForLevelSelect()的实现,是在ThinkPHP\Library\Vendor\Tree\Category.php,代码如下
<?php
/**
* 无限级分类递归方法类
* @Author: 穆沂华
* @Date: 2017/10/6 22:39
* @Web: http://www.dengmuhua.cn * @Email: woody_deng@163.com
* @Last Modified by: 穆沂华
* @Last Modified time: 2017/10/6 22:39
*/
class Category {
/**
* 组合一维数组[在添加选择]
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function unlimitedForLevelSelect1($cate, $html = '|--', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevelSelect1($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合一维数组[在添加选择]
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function unlimitedForLevelSelect($cate, $html = '├', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevelSelect($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合一维数组【在列表显示,专用于公司部门显示】
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function departmentLevel($cate, $html = '<img src="/Public/admin/img/line.gif">', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['parent_id'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::departmentLevel($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合一维数组【在列表显示】
* @param [type] $cate [description]
* @param string $html [description]
* @param integer $pid [description]
* @param integer $level [description]
* @return [type] [description]
*/
static public function unlimitedForLevel($cate, $html = '<img src="/Public/admin/img/line.gif">', $pid = 0, $level = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level + 1;
$v['html'] = str_repeat($html,$level);
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevel($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}
/**
* 组合多维数组
* @param [type] $cate [description]
* @param string $name [description]
* @param integer $pid [description]
* @return [type] [description]
*/
static public function unlimitedForLayer($cate, $name = 'child', $pid = 0){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v[$name] = self::unlimitedForLayer($cate, $name, $v['id']);
$arr[] = $v;
}
}
return $arr;
}
/**
* 传递一个子分类返回所有的父级Id
* @param [type] $cate [description]
* @param [type] $id [description]
* @return [type] [description]
*/
static public function getParentsId($cate, $id){
$arr = array();
foreach ($cate as $v) {
if ($v['id'] == $id) {
$arr[] = $v['id'];
$arr = array_merge(self::getParentsId($cate, $v['pid']), $arr);
}
}
return $arr;
}
/**
* 传递一个子分类返回所有的父级分类
* @param [type] $cate [description]
* @param [type] $id [description]
* @return [type] [description]
*/
static public function getParents($cate, $id){
$arr = array();
foreach ($cate as $v) {
if ($v['id'] == $id) {
$arr[] = $v;
$arr = array_merge(self::getParents($cate, $v['pid']), $arr);
}
}
return $arr;
}
/**
* 传递一个父级分类返回所有的子级Id
* @param [type] $cate [description]
* @param [type] $pid [description]
* @return [type] [description]
*/
static public function getChildrenId($cate, $pid){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$arr[] = $v['id'];
$arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
}
}
return $arr;
}
/**
* 传递一个父级分类返回所有的子级分类
* @param [type] $cate [description]
* @param [type] $pid [description]
* @return [type] [description]
*/
static public function getChildren($cate, $pid){
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$arr[] = $v;
$arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
}
}
return $arr;
}
}
以上的就是栏目的增删改查,还有一个删除的功能,留给你们自己完成
有什么不明白可以通过以下的方法进行沟通了解
QQ:2363536014
待续~~~~~
相关文章推荐
- 从头到尾实现一个用TP开发的个人站点【三】
- 从头到尾实现一个用TP开发的个人站点【四】
- 团队开发中,如何处理一个站点不同Web应用通用Session
- 谋划开发一个免费的Web个人知识管理系统
- 基于.net开发的遵循web标准的个人站点程序包下载
- 使用Remoting开发分布式应用(四) ——采用回调实现一个聊天程序
- 团队开发中,如何处理一个站点不同Web应用通用Session (转载)
- 用一个WEB服务或普通站点 实现这样一个效果?以URL请求,返回一个XML文档
- 一个不写程序的老程序员的个人开发计划
- 程序终于实现跨机器运行——记VC++2005程序开发的一个常见问题
- 个人实现的一个简单的ipv4地址转换为二进制显示的脚本
- 团队开发中,如何处理一个站点不同Web应用通用Session(ZT)
- ASP.NET MVC+LINQ开发一个图书销售站点(1):需求分析
- 团队开发中,如何处理一个站点不同Web应用通用Session
- 一个购物车的简单实现(多层开发)
- 一个购物车的简单实现(多层开发)
- 团队开发中,如何处理一个站点不同Web应用通用Session
- 团队开发中,如何处理一个站点不同Web应用通用Session
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- 夹杂着文艺复兴时期色彩的一个Web开发站点