thinkphp論壇項目開發

来源:https://www.cnblogs.com/chenyingying0/archive/2020/01/17/12205495.html
-Advertisement-
Play Games

效果圖 首先是資料庫 /* Navicat MySQL Data Transfer Source Server : xm Source Server Version : 50553 Source Host : localhost:3306 Source Database : test Target ...


效果圖

首先是資料庫

/*
Navicat MySQL Data Transfer

Source Server         : xm
Source Server Version : 50553
Source Host           : localhost:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 50553
File Encoding         : 65001

Date: 2019-01-17 15:00:23
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for test_topic
-- ----------------------------
DROP TABLE IF EXISTS `test_topic`;
CREATE TABLE `test_topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_at` int(11) NOT NULL,
  `is_delete` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=57 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test_topic
-- ----------------------------
INSERT INTO `test_topic` VALUES ('48', 'php是最好的語言4', '沙發是的範德薩撒範德薩發敖德薩多第三方撒地方大SAV大V', '33', '1547610289', '0');
INSERT INTO `test_topic` VALUES ('49', 'ceshi ', '大大沙發斯蒂芬', '33', '1547610343', '0');
INSERT INTO `test_topic` VALUES ('50', '的是非得失', '第三個教廷', '33', '1547610400', '0');
INSERT INTO `test_topic` VALUES ('51', '多福多壽', '阿道夫', '33', '1547610507', '0');
INSERT INTO `test_topic` VALUES ('52', '王企鵝去吧', '無法讓我', '33', '1547633627', '0');
INSERT INTO `test_topic` VALUES ('53', '我的錢多額', 'werewolf未確認翁', '33', '1547633684', '0');
INSERT INTO `test_topic` VALUES ('54', '2323232', '232323', '33', '1547633838', '0');
INSERT INTO `test_topic` VALUES ('55', '2323232', '232323', '33', '1547634620', '0');
INSERT INTO `test_topic` VALUES ('56', '56ttt', '232323跳跳糖', '33', '1547634633', '0');

-- ----------------------------
-- Table structure for test_user
-- ----------------------------
DROP TABLE IF EXISTS `test_user`;
CREATE TABLE `test_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL COMMENT '用戶名',
  `email` varchar(100) CHARACTER SET latin1 NOT NULL COMMENT '郵箱',
  `avatar` varchar(255) CHARACTER SET latin1 NOT NULL,
  `password` varchar(100) CHARACTER SET latin1 NOT NULL COMMENT '密碼',
  `created_at` int(11) NOT NULL,
  `is_delete` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test_user
-- ----------------------------
INSERT INTO `test_user` VALUES ('23', 'zxj', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547607239', '0');
INSERT INTO `test_user` VALUES ('29', '', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547608741', '0');
INSERT INTO `test_user` VALUES ('30', '', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547608915', '0');
INSERT INTO `test_user` VALUES ('31', '', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547609026', '0');
INSERT INTO `test_user` VALUES ('32', '', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547609076', '0');
INSERT INTO `test_user` VALUES ('33', 'root', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547609167', '0');
INSERT INTO `test_user` VALUES ('34', 'root', '[email protected]', 'images/avatar.jpg', '9db06bcff9248837f86d1a6bcf41c9e7', '1547609206', '0');

模型層

application/common/model/Base.php

<?php
namespace app\common\model;
use think\Model;
class Base extends Model{

    protected $autoWriteTimestamp = true;
    protected $createTime='created_at';
    /**
     * 新增邏輯
     * @auth  cyy
     * @param array  $data [description]
     * @return  int
     */
    public function add($data = []) {
        if(empty($data) || !is_array($data)) {
            return false;
        }

        $this->allowField(true)->save($data);
        return $this->id;
    }
}

application/common/model/Topic.php

<?php
namespace app\common\model;
class Topic extends Base
{
    //查詢屬於哪個用戶
    public function user()
    {
        // 連接topic表中的user_id
        return $this->hasOne('User','id','user_id');
    }

    //獲取所有留言
    public static function getTopics()
    {
        $topics = model("Topic")
            ->order("id", "desc")
            ->select();
        return $topics;
    }
    
    //獲取某條留言
    public static function getTopic($id)
    {
        $topic = self::find(['id' => $id]);
        //print_r(model("Topic")->getLastSql());die();
        return $topic;
    }
}

application/common/model/User.php

<?php
namespace app\common\model;
use think\Model;

class User extends Base{
    //查詢賬號
    public function isUser($condition) {
        return $this->where($condition)
             ->limit(1)
             ->select();
    }
}

控制器層

application/index/controller/Base.php

<?php
namespace app\index\controller;
use think\Controller;
class Base extends Controller {

    /**
     * 空操作
     * @auth   singwa
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public function _empty($name) {
        return $name;
    }
}

application/index/controller/Index.php

<?php
namespace app\index\controller;
use think\Db;
use app\common\model\User;
use app\common\model\Topic as TopicModel;
class Index extends Base
{
    public function index()
    {
        //獲取session
        $name=session('name');
        //獲取留言列表
        $topic=model('Topic');
        $topics=$topic->getTopics();
        //輸出到模板
        
        echo  $this->fetch('',[
            'name'=>$name,
            'topics'=>$topics,
        ]);
    }

    //註冊
    public function register()
    {
        echo  $this->fetch();
    }

    //添加賬號
    public function add(){
        //如果有數據提交
        if(!empty(input('param.'))){
            //接收數據
            $userdata=input('param.');
            $name=$userdata['username'];
               $email=$userdata['email'];
            $password=$userdata['password'];
            $password_confirmation=$userdata['password_confirmation'];
            //驗證確認密碼是否正確
            if($password_confirmation!=$password){
                $this->error('兩次密碼輸入不一致','index/register');
            }
            $data=[
                'name'=>$name,
                'email'=>$email,
                'password'=>$password,
            ];
            //存儲數據
            $user=model('User');
            $id=$user->add($data);
            $this->success('註冊成功','index/login');
        }
    }

    //登錄
    public function login()
    {
        //檢測是否登錄
        if(session('name')){
            return $this->error('您已經登錄',url('index/index'));
        }
        echo  $this->fetch();
        //獲取session
        $name=session('name');
        //輸出到頭部模板
        echo  $this->fetch('common/header',[
            'name'=>$name,
        ]);
    }

    //登錄檢測
    public function isUser(){
        //如果有數據提交
        if(!empty(input('param.'))){
            //接收數據
            $userdata=input('param.');
            $login=$userdata['login'];
            $password=$userdata['password'];
            //查詢條件
            $condition1=[
                'name'=>$login,
                'password'=>$password,
            ];
            $condition2=[
                    'email'=>$login,
                    'password'=>$password,
                ];
            //查詢
            $user=model('User');
            $login1=$user->isUser($condition1);
            $login2=$user->isUser($condition2);
            if(!empty($login1)){
                //姓名登錄
                session('id',$login1[0]->id);
                session('name',$login1[0]->name);
                $this->success('登錄成功','index/index');
            }else if(!empty($login2)){
                //郵箱登錄
                session('id',$login2[0]->id);
                session('name',$login2[0]->name);
                $this->success('登錄成功','index/index');
            }else{
                $this->error('登錄失敗','index/login');
            }
        }
    }

    //退出
    public function logout(){
        session('name',null);
        $this->redirect('index/index');
    }
}

application/index/controller/Topic.php

<?php
namespace app\index\controller;
use think\Db;
use app\common\model\Topic as TopicModel;
class Topic extends Base
{
    public function _initialize(){
        //檢測是否登錄
        if(!session('name')){
            $this->error('您沒有登錄',url('index/login'));
        }
    }
    //發帖頁面
    public function new_topic(){
        echo  $this->fetch();
        //獲取session
        $name=session('name');
        //輸出到頭部模板
        echo  $this->fetch('common/header',[
            'name'=>$name,
        ]);
    }

    //添加新帖
    public function add_topic(){
        //如果有數據提交
        if(!empty(input('param.'))){
            //接收數據
            $topicdata=input('param.');
            $title=$topicdata['title'];
               $content=$topicdata['content'];
               $user_id=session('id');

            $data=[
                'title'=>$title,
                'content'=>$content,
                'user_id'=>$user_id,
            ];
            //存儲數據
            $topic=model('Topic');
            $id=$topic->add($data);
            $this->success('添加成功','index/index');
        }
    }

    //編輯新帖頁面
    public function detail_topic(){
        //接收id
        $id=input('param.id');
        //查詢這條帖子的發佈者
           $condition=[
               'id'=>$id,
           ];
           $user=model('Topic')->where($condition)->find();
           $user_id=$user->user_id;
           //判斷是否有許可權編輯帖子
           if(session('id') != $user_id){
               $this->error('您沒有許可權修改!');
           }
        $topic=model('Topic')->getTopic($id);
        echo  $this->fetch('',[
            'topic'=>$topic,
        ]);
        //獲取session
        $name=session('name');
        //輸出到頭部模板
        echo  $this->fetch('common/header',[
            'name'=>$name,
        ]);
    }

    //更新帖子數據
    public function update_topic(){
        //如果有數據提交
        if(!empty(input('param.'))){
            //接收數據
            $topicdata=input('param.');
            $title=$topicdata['title'];
               $content=$topicdata['content'];
               $id=$topicdata['id'];

            $data=[
                'title'=>$title,
                'content'=>$content,
            ];
            $condition=[
                   'id'=>$id,
               ];
            //存儲數據
            $res=model('Topic')->where($condition)->update($data);
            if($res){
                $this->success('編輯成功','index/index');
            }else{
                $this->error('編輯失敗');
            }
            
        }
    }
}

視圖層

application/index/view/common/header.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>test論壇</title>
  <link rel="stylesheet" href="<?=STATIC_URL?>css/all-df86af5803.css">
  <script src="<?=STATIC_URL?>js/all-17476e6cc3.js"></script>
</head>
<body class="forum" data-page="forum">
  <div class="header">
    <nav class="navbar navbar-inverse navbar-fixed-top navbar-default">
      <div class="container">
        <div class="navbar-header" id="navbar-header">
          <a href="<?=url('index/index');?>" class="navbar-brand"><img src="<?=STATIC_URL;?>images/logo.png"></a>
        </div>
        <div id="main-nav-menu">
          <ul class="nav navbar-nav">
            <li class="active">
              <a href="<?=url('index/index');?>">
                <i class="fa fa-home"></i>
                <span class="hidden-xs hidden-sm">首頁</span>
              </a>
            </li>
          </ul>
        </div>
        <ul class="nav navbar-nav navbar-right">
          <?php if(!isset($name)): ?>
            <li><a href="<?=url('index/register');?>" id="signup-btn">註冊</a></li>
            <li><a href="<?=url('index/login');?>" id="login-btn">登錄</a></li>
          <?php else: ?>
            <li><a href="<?=url('topic/new_topic');?>">發帖</a></li>
            <li>
              <ul class="nav user-bar navbar-nav navbar-right">
                <li class="dropdown">
                  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><?php echo $name; ?>
                       <span class="caret"></span></a>
                  <button class="navbar-toggle" type="button" data-toggle="dropdown" role="button" aria-expanded="false">
                    <span class="sr-only">Toggle</span>
                    <i class="fa fa-reorder"></i>
                  </button>
                  <ul class="dropdown-menu" role="menu">

                    <li class='divider'></li>
                    <li>
                        <a href="<?=url('index/logout');?>" onclick="return confirm('你確定要退出嗎?')"><i class="fa fa-sign-out"></i>退出</a>
                    </li>
                  </ul>
                </li> 
              </ul>
            </li>
          <?php endif; ?>
        </ul>
      </div>
    </nav>
  </div>

application/index/view/common/footer.html

    <footer class="footer">
      <div class="container">
        <div class="copyright">
          <blockquote class="pull-left">
            <p>test論壇</p>
            <p>Copyright &copy;
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ©Copyright 蕃薯耀 2020-01-17 https://www.cnblogs.com/fanshuyao/ 具體的方法如下: /** * 把字元串數字類型的數字取出來(只取遇到非數字字元前,包括空格) * @param str * <li>"1-0我5013我24a5c6" 》 1</ ...
  • 你可以訪問 "碼雲 樂優商城" 來獲取關於樂優商城的工程代碼。 你可以訪問 "百度雲 樂優優商城" 密碼:ppzy 來獲取關於樂優商城的資料。 一、創建父工程 Maven Project 用來管理依賴 GroupId:項目中唯一標識符,對應的是java中的包結構,在這裡表示項目中的結構 Artifa ...
  • 之前我們用SSM或者SSH進行JAVA WEB開發的時候,IDEA 需要配置Tomcat然後把項目放到tomcat運行,tomcat啟動的時候會自動打開瀏覽器去訪問項目,但是SpringBoot是內嵌tomcat的,項目啟動成功後無法自主訪問,需要我們手動打開瀏覽器輸入url訪問,我覺得這樣很不習慣... ...
  • 前言 Golang 目前的主要應用領域還是後臺微服務,雖然在業務領域也有所應用但仍然是比較小衆的選擇。大多數的服務運行環境都是linux,而在windows中golang應用更少,而作者因爲特殊情況,不得已要在widows環境中用golang去寫本地代理服務。在我的使用場景中實時性要求非常高(視頻通 ...
  • import java.io.*; public class test13_6 { public static void main(String []args) throws Exception { FileOutputStream output=null; FileInputStream inpu ...
  • 原文:https://www.jianshu.com/p/e88d3f8151db JWT官網: https://jwt.io/ JWT(Java版)的github地址:https://github.com/jwtk/jjwt 什麼是JWT Json web token (JWT), 是為了在網路應 ...
  • 一、Unittest 單元測試框架,可用於自動化測試用力組織,執行,輸出結果 二、Unittest構成 1. Test Case 2. Test Suite 3. Test Fixture 4. Test Runner (圖片來源於網路) Test Case 一個測試用例是一個獨立的測試單元。它檢查 ...
  • 你可以訪問 "碼雲 樂優商城" 來獲取關於樂優商城的工程代碼。 你可以訪問 "百度雲 樂優優商城" 密碼:ppzy 來獲取關於樂優商城的資料。 一、介紹 樂優商城是一個全品類的電商購物網站(B2C),作為階段性學習工程。 二、軟體架構 三、前端技術選型 1. 基礎的HTML、CSS、JavaScri ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...