1. 程式人生 > >php thinkphp3 開發新聞網站+後臺管理系統

php thinkphp3 開發新聞網站+後臺管理系統

一:需求分析

ThinkPHP(3.2.3完整版)瞭解:mvc開發框架.

1.主目錄結構:

index.php訪問入口配置檔案

Application應用目錄裡面放的是每個模組檔案。

Public資原始檔目錄,裡面存放的是css,js,image等靜態檔案

ThinkPHP裡面是框架的核心內容


2:ThinkPHP目錄


Common存放的函式,在任何地方都可以直接使用,所以是公共函式目錄

Conf裡面是核心配置目錄

thinkphp.php是框架入口檔案,其它目錄就不再深入瞭解了。

結合Thinkphp文件學習。

3.框架的執行原理

首先執行專案時會先到index.php入口配置檔案.


進入入口檔案首先 require './ThinkPHP/ThinkPHP.php'; 這樣就會載入Thinkphp目錄下的核心內容功能。

第一次執行這個專案後Application目錄(一開始裡面沒內容)下會自動生成這三個目錄。Common(公用目錄),Home目錄是模組目錄。應用模組下的目錄Common公共函式模組,Conf配置模組,Controller(實現業務模組)控制器模組,Model模型模組,View檢視模組。

資料庫:(需要索引的欄位要建立索引)

cms_admin(後臺使用者表):admin_id(主鍵),username(建立索引),password,lastloginip,lastlogintime,email,realname,status;

cms_menu(選單表):menu_id(主鍵),name,parentid(建立索引),m,c,f,listorder(建立索引),status,type.

cms_news(文章表主表):news_id.........等

cms_news_content(文章詳情表):id,......等----主要存放文章主表的文章內容。

cms_position(推薦位表):id,name,status,descripation,createtime,update_time等

cms_postion_content(推薦位詳情表):id,postion_id,title,thumb,url,news_id,listorder,status...等----主要存放推薦位裡面存放的文章內容。

根據自己的需要設計文章內容。

後臺管理系統

在Application下建立目錄Admin:


首先建立後臺登入url:localhost/thinkphp/index.php?m=admin&c=login&f=index


提交按鈕的表單內容:

<div class="s_center container col-lg-6 ">


    <form class="form-signin" enctype="multipart/form-data"  method="post" >
      <h2 class="form-signin-heading">請登入</h2>
      <label class="sr-only">使用者名稱</label>
      <input type="text"  class="form-control" name="username" placeholder="請填寫使用者名稱" required autofocus>
      <br />
      <label  class="sr-only">密碼</label>
      <input type="password" name="password" id="inputPassword" class="form-control" placeholder="密碼" required>
      <br />
      <button class="btn btn-lg btn-primary btn-block" type="button" onclick="login.check()" ">登入</button>
    </form>


</div>

<script src="__PUBLIC__/js/jquery.js"></script>
<script src="__PUBLIC__/js/dialog/layer.js"></script>
<script src="__PUBLIC__/js/dialog.js"></script>
<script src="__PUBLIC__/js/admin/login.js"></script>

上面要記得引入這些js檔案才能實現對應的邏輯。__PUBLIC__指的是public目錄。

dialog.js的內容為:

var dialog = {
    // 錯誤彈出層
    error: function(message) {
        layer.open({
            content:message,
            icon:2,
            title : '錯誤提示',
        });
    },


    //成功彈出層
    success : function(message,url) {
        layer.open({
            content : message,
            icon : 1,
            yes : function(){
                location.href=url;
            },
        });
    },


    // 確認彈出層
    confirm : function(message, url) {
        layer.open({
            content : message,
            icon:3,
            btn : ['是','否'],
            yes : function(){
                location.href=url;
            },
        });
    },


    //無需跳轉到指定頁面的確認彈出層
    toconfirm : function(message) {
        layer.open({
            content : message,
            icon:3,
            btn : ['確定'],
        });
    },
}


login.js的內容為

/**
 * 前端登入業務類
 * @author singwa
 */
var login = {   //宣告login類 ,方法check:function(){....}
    check : function() {
        // 獲取登入頁面中的使用者名稱 和 密碼
        var username = $('input[name="username"]').val();
        var password = $('input[name="password"]').val();


        if(!username) {

            dialog.error('使用者名稱不能為空');   //彈出視窗,一般我們使用alter,這裡對彈出做了美化.使用Layer(網)layer.layui.cpm

        }
        if(!password) {
            dialog.error('密碼不能為空');  //同上。dialog.js
        }


        var url = "/thinkphp/admin.php?&c=login&a=check"; //請求地址是m=admin,c=login,a=check
        var data = {'username':username,'password':password};//請求的資料內容
        // 執行非同步請求  $.post
        $.post(url,data,function(result){    /jquery的方法,post非同步請求,請求後收到伺服器的返回結果result.
            if(result.status == 0) {//判斷返回狀態
                return dialog.error(result.message);//彈出錯誤資訊
            }
            if(result.status == 1) {
                return dialog.success(result.message, '/thinkphp/admin.php?');//跳轉到後臺m=admin,c=index,f=index.
            }


        },'JSON');//JSON資料格式傳送。


    }
}

在Controller建立控制器LoginController.class.php檔案內容為:

<?php
namespace Admin\Controller;  //宣告類的名稱空間通過路徑載入類
use Think\Controller;     //控制器需要繼承的父類引入
class LoginController extends Controller {
 
    public function index(){   //引入方法名index
       if(session('adminUser')){//檢查session 判斷使用者是否已經登陸了,如果未登入回到登入頁面。如果登入跳轉到後臺頁面

           $this->redirect('/thinkphp/admin.php?c=index');

         //這裡也可以寫/thinkphp/index.php?m=admin&c=index&a=index

       }
       $this ->display();//如果已經登入跳轉到View目錄下的Login目錄下的index.html
            // admin.php?c=index
    }
    public function check(){//點選登入頁面後將資料提交到這個方法裡,ajax,非同步載入傳送過來的資料.
        $username=$_POST['username'];
        $password=$_POST['password'];
        if(!trim($username)){
          return show(0,'使用者名稱不能為空');//由於要返回一個result到前臺頁面,下面的邏輯是一樣的,判斷髮送的資料是否合法。並且返回狀態碼 ,0相當result.status  使用者不能為空相當於result,message.
            
        }
        if(!trim($password)){
           return show(0,'密碼不能為空');
        }
        $ret=D('Admin')->getAdminByUsername($username);//使用者表模型查詢
        if(!$ret){
           return show(0,'該使用者不存在');

        }

       //getMd5Password是Commont公共函式寫的MD5加密函式。

        if($ret['password']!=getMd5Password($password)){
            return show(0,'密碼錯誤');

        }

      //登入後更新登入時間

        D('Admin')->updateByAdminId($ret['admin_id'],array('lastlogintime'=>time()));
        session('adminUser',$ret);
        return show(1,'登入成功');
    }
    public function loginout(){
         session('adminUser', null);
        $this->redirect('/thinkphp/admin.php?c=login');
    }

}

show函式的編寫  (在公共模組下編寫)

function show($status,$message,$data=array()){  //傳入狀態 資訊 陣列預設空陣列
    $result=array(   //result陣列對應資訊編寫。
        'status'=>$status,
        'message'=>$message,
        'data'=>$data,
    );
    exit(json_encode($result));//json資料格式返回前臺。

}

配置檔案db.php(因為資料庫是前後臺都要訪問的所以寫在Common目錄下,db.php是配置資料的配置檔案)

<?php
 return array(
     'DB_TYPE'=>'mysql',
     'DB_HOST'=>'127.0.0.1',
     'DB_USER'=>'root',
     'DB_PWD'=>'root',
     'DB_PORT'=>3306,
     'DB_NAME'=>'singcms',
     'DB_CHARSET'=>'utf8',
     'DB_PREFIX'=>'cms_',//資料表字首
 );
?>

配置檔案config.php

<?php
return array(
//'配置項'=>'配置值'
'URL_CASE_INSENSITIVE'=>true,
    'URL_MODEL'=>0,
    'LOAD_EXT_CONFIG'=>'db',   //上面配置的資料庫配置檔案載入進來。
    'MD5_PRE'=>'sing_cms',
    'HTML_FILE_SUFFIX'=>'.html',

);

Common模組下建立Model資料夾(操作資料庫)

<?php
namespace Common\Model;
use Think\Model;


/**
 * 使用者組操作
 * @author  singwa
 */
class AdminModel extends Model {
private $_db = '';

       //建構函式
public function __construct() {
$this->_db = M('admin');
}
   //根據使用者名稱查詢使用者下面根據對應函式名瞭解其中的含義
    public function getAdminByUsername($username='') {
        $res = $this->_db->where(array(
            'username'=>$username,
            'status'=>1,
        ))->find();
        return $res;
    }
    public function getAdminByAdminId($adminId=0) {
        $res = $this->_db->where('admin_id='.$adminId)->find();
        return $res;
    }


    public function updateByAdminId($id, $data) {


        if(!$id || !is_numeric($id)) {
            throw_exception("ID不合法");
        }
        if(!$data || !is_array($data)) {
            throw_exception('更新的資料不合法');
        }
        return  $this->_db->where('admin_id='.$id)->save($data); // 根據條件更新記錄
    }


    public function insert($data = array()) {
        if(!$data || !is_array($data)) {
            return 0;
        }
        return $this->_db->add($data);
    }


    public function getAdmins() {
        $data = array(
            'status' => array('neq',-1),
        );
        return $this->_db->where($data)->order('admin_id desc')->select();
    }
    /**
     * 通過id更新的狀態
     * @param $id
     * @param $status
     * @return bool
     */
    public function updateStatusById($id, $status) {
        if(!is_numeric($status)) {
            throw_exception("status不能為非數字");
        }
        if(!$id || !is_numeric($id)) {
            throw_exception("ID不合法");
        }
        $data['status'] = $status;
        return  $this->_db->where('admin_id='.$id)->save($data); // 根據條件更新記錄


    }


    public function getLastLoginUsers() {
        $time = mktime(0,0,0,date("m"),date("d"),date("Y"));
        $data = array(
            'status' => 1,
            'lastlogintime' => array("gt",$time),
        );


        $res = $this->_db->where($data)->count();
        return $res['tp_count'];
    }


}

在目錄下新增一個後臺url  admin.php內容為 這樣設定訪問localhost/thinkphp/admin.php

相當於localhost/thinkphp/admin.php?m=admin&c=index&a=index

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <[email protected]>
// +----------------------------------------------------------------------


// 應用入口檔案


// 檢測PHP環境
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');


// 開啟除錯模式 建議開發階段開啟 部署階段註釋或者設為false
define('APP_DEBUG',True);
$_GET['m'] = (!isset($_GET['m']) || !$_GET['m']) ? 'admin' : $_GET['m'];
$_GET['c'] = (!isset($_GET['c']) || !$_GET['c'])  ? 'index' : $_GET['c'];
$_GET['a'] = (!isset($_GET['a']) || !$_GET['a']) ? 'index' : $_GET['a'];
// 定義應用目錄
define('APP_PATH','./Application/');


// 引入ThinkPHP入口檔案
require './ThinkPHP/ThinkPHP.php';


// 親^_^ 後面不需要任何程式碼了 就是如此簡單

以上就完成了後臺使用者的登入。

接下來需要完成選單管理功能:url localhost/thinkphp/index.php?m=admin&c=menu&a=index

這個頁面應該顯示預設存在的選單內容,但是第一次建立是沒有資料的,這時候在這個頁面新增一個新增按鈕。

這個按鈕跳轉到新增選單內容。

$("#button-add").click(function(){

    var url = SCOPE.add_url; //這個url是寫在選單管理的預設index.html內,url為localhost/thinkphp/index.php?m=admin&c=menu&a=add

    window.location.href=url;

});

按鈕新增點選事件後,點選按鈕就跳轉的頁面SCOPE.add_url。跳轉到這個頁面後,填入表單提交的資料內容。

後臺控制器對應方法接收資料,並處理,這裡使用ajax非同步傳送資料。

$("#singcms-button-submit").click(function(){
    var data = $("#singcms-form").serializeArray(); //表單資料序列化後。
    postData = {};
    $(data).each(function(i){//把這個表單序列化資料轉換成陣列
       postData[this.name] = this.value;
    });
    //console.log(postData);
    // 將獲取到的資料post給伺服器
    url = SCOPE.save_url;
    jump_url = SCOPE.jump_url;
    $.post(url,postData,function(result){
        if(result.status == 1) {
            //成功後跳轉回選單管理預設頁面
            return dialog.success(result.message,jump_url);
        }else if(result.status == 0) {
            // 失敗
            return dialog.error(result.message);
        }
    },"JSON");
});

<?php
namespace Admin\Controller;
use Think\Controller;
use Think\Exception;
class MenuController extends  CommonController{
 
    public function index(){       //選單預設頁面現在先不需要看
        $data=array();
        if(isset($_REQUEST['type'])&&in_array($_REQUEST['type'],array(0,1))){
            $data['type']=intval($_REQUEST['type']);
            $this->assign('type',$data['type']);
        }
        else{
            $this->assign('type',-1);
        }
       /**
        * 分頁操作邏輯
        */
      
       $page=$_REQUEST['p']? $_REQUEST['p']:1;
       $pageSize=$_REQUEST['pageSize']? $_REQUEST['pageSize']:3;
       $menus=D('Menu')->getMenus($data,$page,$pageSize);
       $menusCount=D('Menu')->getMenusCount($data);
       $res=new \Think\Page($menusCount,$pageSize); //Thinkphp自帶分頁函式傳入數量和每頁大小會生成對應的分頁效果
       $pageRes=$res->show();
       $this->assign('pageRes',$pageRes);//向頁面傳遞資料
       $this->assign('menus',$menus);//向頁面傳遞資料
       $this ->display();//跳轉到對應的檔名
    }
    public function add(){//這裡就是add的方法,把資料傳送到這裡
        if($_POST){//如果提交的資料不為空
            if(!isset($_POST['name'])|| !$_POST['name']){
                return show(0,'選單名不能為空');
            }
            if(!isset($_POST['m'])|| !$_POST['m']){
                return show(0,'模組名不能為空');
            }
            if(!isset($_POST['c'])|| !$_POST['c']){
                return show(0,'控制器名不能為空');
            }
            if(!isset($_POST['f'])|| !$_POST['f']){
                return show(0,'方法名不能為空');
            }
            if($_POST['menu_id']){
                return $this->save($_POST);
            }
            $menuId=D('Menu')->insert($_POST);
            if($menuId){
                return show(1,'新增成功',$menuId);
            }
            return show(0,'新增失敗',$menuId);
        }
        else{
            $this->display();
        }
    }
    public function edit(){
        $menuId=$_GET['id'];
        $menu=D('Menu')->find($menuId);
        $this->assign('menu',$menu);
        $this->display();
    }
    public function save($data){
        $menuId=$data['menu_id'];
        unset($data['menu_id']);
        try{
        $id=D('Menu')->updateMenuById($menuId,$data);
            if($id === false){
                return show(0,'更新失敗');
            }
            return show(1,'更新成功');
        }catch(Exception $e){
            return show(0,$e->getMessage());
        }
        
    }
    
    public function setStatus(){
        try{
        if($_POST){
           $id=$_POST['id'];
           $status=$_POST['status'];
           //執行資料更新操作;
           $res=D('Menu')->updateStatusById($id,$status);
           if($res){
               return show(1,'操作成功');
           }
           else{
               return show(0,'操作失敗');
           }
        }
        }catch(Exception $e){
            return show(0,$e->getMessage());
        }
        return show(0,'沒有提交資料');
    }
    public function listorder(){
       $listorder=$_POST['listorder'];
      // return show(0,$jumpUrl);
       $jumpUrl = $_SERVER['HTTP_REFERER'];
       $errors=array();
       if($listorder){
           try{
           foreach ($listorder as $menuId=>$v){
               //執行更新
              $id= D('Menu')->updateMenuListorderById($menuId,$v);
              if($id === false){
                  $errors[]=$menuId;
              }
           }
           }catch (Exception $e){
               return show(0,$e->getMessage(),array('jump_url' => $jumpUrl));
           }
           if($errors){
               return show(0,'排序失敗-'.implode(',',$errors),array('jump_url' => $jumpUrl));
           }
           return show(1,'排序成功',array('jump_url' => $jumpUrl));
       }
       return show(0,'排序資料失敗',array('jump_url' => $jumpUrl));
    }

}

這是一個例子,接下來的內容類似的,其它模組的編寫相似,這裡就不一一重複了。

這裡來詳細瞭解一下文章的新增,其中的富文字編輯,已經圖片上傳功能。這裡使用了party外掛

/**
 * 圖片上傳功能
 */
$(function() {
    $('#file_upload').uploadify({
        'swf'      : SCOPE.ajax_upload_swf, 
        'uploader' : SCOPE.ajax_upload_image_url,   //url=localhost/thinkphp/admin.php?c=image&a=ajaxuploadimage
        'buttonText': '上傳圖片',
        'fileTypeDesc': 'Image Files',
        'fileObjName' : 'file',
        //允許上傳的檔案字尾
        'fileTypeExts': '*.gif; *.jpg; *.png',
        'onUploadSuccess' : function(file,data,response) {
            // response true ,false
            if(response) {
                var obj = JSON.parse(data); //由JSON字串轉換為JSON物件
                 
                //console.log(data);
                //console.log(obj);
               
                $('#' + file.id).find('.data').html(' 上傳完畢');


                $("#upload_org_code_img").attr("src",obj.data);//把返回的url填入表單
                $("#file_upload_image").attr('value',obj.data);//把返回的url填入表單
                $("#upload_org_code_img").show();//圖片展示,一開始隱藏圖片位置
            }else{
                alert('上傳失敗');
            }
        },
    });
});


model圖片上傳類:

<?php
namespace Common\Model;
use Think\Model;


/**
 * 上傳圖片類
 * @author  singwa
 */
class UploadImageModel extends Model {
    private $_uploadObj = '';
    private $_uploadImageData = '';


    const UPLOAD = 'upload';


    public function __construct() {
        $this->_uploadObj = new  \Think\Upload();  //Thinkphp自帶上傳功能


        $this->_uploadObj->rootPath = './'.self::UPLOAD.'/';    //上傳根路徑
        $this->_uploadObj->subName = date(Y) . '/' . date(m) .'/' . date(d); //上傳子檔名字
    }


    public function upload() {//上傳方法上傳成功後返回url路徑
        $res = $this->_uploadObj->upload();
        if($res) {
            return '/thinkphp/' .self::UPLOAD . '/' . $res['imgFile']['savepath'] . $res['imgFile']['savename'];
        }else{
            return false;
        }
    }


    public function imageUpload() {//上傳方法上傳成功後返回url路徑
        $res = $this->_uploadObj->upload();
        if($res) {
            return '/thinkphp/' .self::UPLOAD . '/' . $res['file']['savepath'] . $res['file']['savename'];
        }else{
            return false;
        }
    }
}

控制器

<?php
/**
 * 圖片相關
 */
namespace Admin\Controller;
use Think\Controller;
use Think\Upload;


/**
 * 文章內容管理
 */
class ImageController extends CommonController {
    private $_uploadObj;
    public function __construct() {


    }
    public function ajaxuploadimage() {
        $upload = D("UploadImage");
        $res = $upload->imageUpload();
        if($res===false) {
            return show(0,'上傳失敗','');
        }else{
            return show(1,'上傳成功',$res);
        }


    }
    public function kindupload(){
        $upload = D("UploadImage");
        $res = $upload->upload();
        
        if($res === false) {
            return showKind(1,'上傳失敗');
        }
        return showKind(0,$res);
    }


}


接下來是富文字內容的上傳

<script>
  // 6.2
  KindEditor.ready(function(K) {
    window.editor = K.create('#editor_singcms',{
      uploadJson : '/thinkphp/admin.php?c=image&a=kindupload',
      afterBlur : function(){this.sync();}, //
    });
  });

</script>

後臺內容就差不多這樣類似的編寫結束了,接下來是前臺的展示。

有些模組為了防止未登陸就進入這裡需要設定一個控制類

<?php
namespace Admin\Controller;
use Think\Controller;
/**
 * use Common\Model 這塊可以不需要使用,框架預設會載入裡面的內容
 */
class CommonController extends Controller {




public function __construct() {

parent::__construct();
$this->_init();
}
/**
* 初始化
* @return
*/
private function _init() {
// 如果已經登入
$isLogin = $this->isLogin();
if(!$isLogin) {
// 跳轉到登入頁面
$this->redirect('/thinkphp/admin.php?c=login');
}
}


/**
* 獲取登入使用者資訊
* @return array
*/
public function getLoginUser() {
return session("adminUser");
}


/**
* 判定是否登入
* @return boolean 
*/
public function isLogin() {
$user = $this->getLoginUser();
if($user && is_array($user)) {
return true;
}


return false;
}


public function setStatus($data, $models) {
try {
if ($_POST) {
$id = $data['id'];
$status = $data['status'];
if (!$id) {
return show(0, 'ID不存在');
}
$res = D($models)->updateStatusById($id, $status);
if ($res) {
return show(1, '操作成功');
} else {
return show(0, '操作失敗');
}
}
return show(0, '沒有提交的內容');
}catch(Exception $e) {
return show(0, $e->getMessage());
}
}


public function listorder($model='') {
$listorder = $_POST['listorder'];
$jumpUrl = $_SERVER['HTTP_REFERER'];
$errors = array();
try {
if ($listorder) {
foreach ($listorder as $id => $v) {
// 執行更新
$id = D($model)->updateListorderById($id, $v);
if ($id === false) {
$errors[] = $id;
}
}
if ($errors) {
return show(0, '排序失敗-' . implode(',', $errors), array('jump_url' => $jumpUrl));
}
return show(1, '排序成功', array('jump_url' => $jumpUrl));
}
}catch (Exception $e) {
return show(0, $e->getMessage());
}
return show(0,'排序資料失敗',array('jump_url' => $jumpUrl));
}


}

需要登陸才能訪問的頁面要繼承這個類。

前臺展示系統

前臺登入的主頁控制器類

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends CommonController {
    public function index($type=''){
        //獲取首頁大圖資料
        $rankNews = $this->getRank();
        $topPicNews=D('PositionContent')->select(array('status'=>1,'position_id'=>3),1);
       // print_r( $topPicNews);
       // exit;
        //首頁3張小圖
        $topSmailNews=D('PositionContent')->select(array('status'=>1,'position_id'=>4),3);
        $listNews = D("News")->select(array('status'=>1,'thumb'=>array('neq','')),30);
        $advNews = D("PositionContent")->select(array('status'=>1,'position_id'=>5),2);
        $this->assign('result',array(
            'topPicNews'=>$topPicNews,
            'topSmailNews'=>$topSmailNews,
            'listNews'=>$listNews,
            'advNews' => $advNews,
            'rankNews' => $rankNews,
            
        ));
        /*
         * 
         * 生成頁面靜態化
         */
        if($type== 'buildHtml'){
            $this->buildHtml('index',HTML_PATH,'Index/index');  //系統生成靜態頁面的方法 ,index名字, 路徑,模板
          
        }
        else{
            $this->display();
        }
       
    }
    public function build_html(){
        $this->index('buildHtml');
        return show(1,'首頁快取生成成功');
    }
    public function crontab_build_html(){
       if(APP_CRONTAB != 1) {
            die("the_file_must_exec_crontab");
        }
        $result = D("Basic")->select();
        if(!$result['cacheindex']) {
            die('系統沒有設定開啟自動生成首頁快取的內容');
        }
        $this->index('buildHtml');
    }
    public function getCount() {
        if(!$_POST) {
            return show(0, '沒有任何內容');
        }
    
        $newsIds =  array_unique($_POST);
    
        try{
            $list = D("News")->getNewsByNewsIdIn($newsIds);
        }catch (Exception $e) {
            return show(0, $e->getMessage());
        }
    
        if(!$list) {
            return show(0, 'notdataa');
        }
    
        $data = array();
        foreach($list as $k=>$v) {
            $data[$v['news_id']] = $v['count'];
        }
        return show(1, 'success', $data);
    }
   

}

其它的類似都是負責展示頁面的邏輯

相關推薦

php thinkphp3 開發新聞網站+後臺管理系統

一:需求分析ThinkPHP(3.2.3完整版)瞭解:mvc開發框架.1.主目錄結構:index.php訪問入口配置檔案Application應用目錄裡面放的是每個模組檔案。Public資原始檔目錄,裡面存放的是css,js,image等靜態檔案ThinkPHP裡面是框架的核

asp.net mvc+jquery easyui開發實戰教程之網站後臺管理系統開發2-Model層建立

ack 前端 strong syn eee 名稱 lar led tegra 上篇(asp.net mvc+jquery easyui開發實戰教程之網站後臺管理系統開發1-準備工作)文章講解了開發過程中的準備工作,主要創建了項目數據庫及項目,本文主要講解項目M層的實現,M層

React開發企業級後臺管理系統(筆記一環境配置)

主要介紹安裝node環境和react環境依賴安裝 node環境安裝 1,官網下載node安裝包。安裝完成後可以通過以下命令查詢安裝版本號 node -v ,只要安裝成功便會自動安裝npm 依賴包管理工

後端初始化 —— Go(全棧)開發企業級後臺管理系統

Abstract: 終於要跟go語言沾邊了,到此,作者還有點小小的興奮呢,也不知道為啥! 不管你之前是否從事過web相關的開發,相信你一定聽過【框架】這個詞,不為什麼,因為隨著社會的發展進步,被前人總結出來的架構,經驗等等,系統的、可複用的東西,我

用Beego和beego admin開源框架開發後臺管理系統

    接觸GO語言一個月不到,已經感到它強大的功能和生命力,做的這個後臺管理系統基於Beego admin開源框架,前端使用easyUI和json方式,實現RESTful,具體細節太多,後面會慢慢說,先發幾個截圖,過過癮。 1、選單 2、裝置管理 3、動態列表維護

微商代理商授權後臺管理系統功能定制開發

微商代理商授權系統 微商代理商授權後臺管理系統功能定制開發(微電:136-4026-5286),企業越做越大,代理商越來越多,在管理上難免會遇到各種各樣的問題。如今越來越多的傳統企業加入到微商的大軍中,據報道,目前在中國有2000~3000萬微商,但他們的日子也沒有想象中來得“滋潤”,痛點明顯

vue開發後臺管理系統小結

關閉 utf 增刪 java 實例 中國農業 hand 分享 this 最近工作需要用vue開發了後臺管理系統,由於是第一次開發後臺管理系統,中間也遇到了一些坑,想在這裏做個總結,也算是對於自己工作的一個肯定。我們金融性質的網站所以就不將代碼貼出來哈 一、項目概述 首先工作

基於Vue+Spring MVC+MyBatis+Shiro+Dubbo開發的分布式後臺管理系統

java dubbo shiro vue 分布式 最近項目中使用了shiro做權限管理,在開發過程中也踩了一些坑,於是便有了開發個應用鞏固一下所學知識的想法,正好在開發的過程裏學習一下Vue開發。技術棧方面,現在前後端分離大行其道,於是也采用了前後端分離的模式,前端基於Vue+Elemen

【轉載】Vue 2.x 實戰之後臺管理系統開發(二)

null element asc 其他 就會 ans 目錄 asi all 2. 常見需求 01. 父子組件通信 a. 父 -> 子(父組件傳遞數據給子組件) 使用 props,具體查看文檔 - 使用 Prop 傳遞數據(cn.vuejs.org/v2/guide

React全家桶+AntD 共享單車後臺管理系統開發

www 高級 charts 底部 集成開發 初始 概念理解 reac 1-1 第1章 課程導學對課程整體進行介紹,並且說明學習的必要性。 1-1 課程導學第2章 React基礎知識React基礎知識以及生命周期的介紹,並使用React官方腳手架初始化基礎項目,同時介紹了新一

我的第一個python web開發框架(33)——後臺管理系統權限設計

style 頁面 失效 限制 路由 前後端分離 也會 其他 自己   框架底層和接口終於改造完成了,小白再次找到老菜。   小白:老大,上次你對後臺權限系統簡單的講了一下,我一點頭緒都沒有,現在有空完整的說一說嗎?   老菜:說到權限系統,要講明白真不容易,權限系統並不

vue-manage-system 後臺管理系統開發總結

前言 vue-manage-system,一個基於 Vue.js 和 element-ui 的後臺管理系統模板,從2016年年底第一個commit,到現在差不多兩年了,GitHub上也有了 5k star,也是這些讓我有了持續更新的動力,其中也踩了很多坑,在

React全家桶+AntD 共享單車後臺管理系統開發完整版

第1章 課程導學 對課程整體進行介紹,並且說明學習的必要性。 1-1 課程導學 對課程整體進行介紹,並且說明學習的必要性。 第2章 React基礎知識 2-1 React基礎介紹 2-3 React生命週期介紹 詳細介紹了初始專案的外掛安裝、主題定製以及主頁面結構設計。

[轉]基於Vue+Spring MVC+MyBatis+Shiro+Dubbo開發的分散式後臺管理系統

最近專案中使用了shiro做許可權管理,在開發過程中也踩了一些坑,於是便有了開發個應用鞏固一下所學知識的想法,正好在開發的過程裡學習一下Vue開發。 技術棧方面,現在前後端分離大行其道,於是也採用了前後端分離的模式,前端基於Vue+Element,後端Web基於Spri

React全家桶+AntD+共享單車後臺管理系統開發(已完整)

第1章 課程導學 對課程整體進行介紹,並且說明學習的必要性。 1-1 課程導學 對課程整體進行介紹,並且說明學習的必要性。 第2章 React基礎知識 2-1 React基礎介紹 2-3 React生命週期介紹 詳細介紹了初始專案的外掛安裝、主題定製以及主頁面結構設計。

React全家桶+AntD框架開發共享單車後臺管理系統

大家好,我是Sun,目前在一家共享單車公司擔任前端架構師職位,作為一名前端工程師,我非常渴望能夠講自己多年來汲取的精華知識傳授給大家,非常渴望能夠去解決大家在開發過程中的痛點。經過一段時間的調研,我總結出了其中一個非常重要的結論,大家在開發後臺管理系統的時候,往往舉足不定,因為工作經驗不

React共享單車後臺管理系統開發(記錄筆記5)——5.1 From元件登入頁面

5.1 From元件登入頁面 具有資料收集、校驗和提交功能的表單,包含複選框、單選框、輸入框、下拉選擇框等元素。 文章目錄 5.1 From元件登入頁面 @[toc] 一.內聯表單(基礎表單) 二

React共享單車後臺管理系統開發(記錄筆記4)——4.7 Carousel輪播圖

4.7 Carousel輪播圖 Carousel走馬燈 文章目錄 4.7 Carousel輪播圖 @[toc] 一.文字背景輪播 二.圖片輪播 API Carou

React共享單車後臺管理系統開發(記錄筆記4)——4.6 gallery圖片畫廊

4.6 gallery圖片畫廊 實現類似照片牆的效果 文章目錄 4.6 gallery圖片畫廊 @[toc] map舉例 一.Tabs元件 二.例項一

React共享單車後臺管理系統開發(記錄筆記4)——4.5 Tabs標籤頁

4.5 Tabs標籤頁 選項卡切換元件。 文章目錄 4.5 Tabs標籤頁 一.Tabs元件 二.基本例項 三. Tab帶圖示頁籤 四. Tab可關閉卡片式頁籤 API[#](https://an