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