One 、    Create a template  demo

1 Tpl Create demo file ----- Enable new templates in the background  ( Website information -- Template scheme )

2 In the template in tpl/demo Create under directory Portal Catalog , And then in Portal Create under directory index.html

The home page is basically divided into the following parts head,header,content,footer,scripts These five parts

<<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>{$site_seo_title} {$site_name}</title>

<meta name="keywords" content="{$site_seo_keywords}" />

<meta name="description" content="{$site_seo_description}">

<tc_include file="Public:head"/><!--head part       Load public CSS and js etc.  -->

</head>

<body>

<tc_include  file="Public:header"/><!--header part       Load navigation, etc  -->

<!-- content  Start  --> This is a ThinkCMF Home page !!<!-- content  end  -->

<tc_include file="Public:footer"/><!--footer part       Load the common bottom , Links, etc  -->

<tc_include file="Public:scripts"/><!--scripts part       Load public js etc.  -->

</body>  </html>

3    Introducing public files

First, in the template directory demo Create a public file directory under Public, This directory is mainly used to store resource files , Public documents, etc ; And then Public Create the second 1 The four files in step head.html,header.html,footer.

html,scripts.html

file Only support :1.  Public: file name    Templates Public A file in a directory ;

2.  : file name          Files in the root directory of the template ;

Head.html:

<tc_include file=":config"/>

<meta name="author" content=" Didi is so alive ">     <meta charset="UTF-8">

<meta http-equiv="x-ua-compatible" content="IE=edge">

<meta name="viewport" content="width=device-width,initial-scale=1">

<!-- Set render engine for 360 browser -->

<meta name="renderer" content="webkit">

<!-- No Baidu Siteapp-->

<meta http-equiv="Cache-Control" content="no-siteapp"/>

<link href="__TMPL__Public/css/bootstrap.min.css" rel="stylesheet">

<link rel="stylesheet" href="__TMPL__Public/css/bootstrap.css">

<link rel="stylesheet" href="__TMPL__Public/css/app.css">

<link rel="icon"  href="__TMPL__Public/img/logo.png">

<style>

@-webkit-keyframes animations{   0%{height: 100%;opacity: 0.3;padding-top:0;}/** Transparency is from shallow to deep , From loading to loading **/

100%{height: 40px;opacity: 0.8;}    }  </style>

Script.html

<script src="__TMPL__Public/js/jquery-1.11.3.js"></script>

<script src="__TMPL__Public/js/bootstrap.js"></script>

<script src="__TMPL__Public/js/html5shiv.min.js"></script>

<script src="__TMPL__Public/js/respond.min.js"></script>

<script src="__TMPL__Public/js/app.js"></script>

<script src="__TMPL__Public/js/bootlint.js"></script>

<!--[endif]-->

4   Use global variables

{$site_name}                    / Site name

{$site_host}                    / Site domain name

{$site_root}                    / The installation directory

{$site_icp}                     / Filing information

{$site_admin_email}             / Administrator mailbox

{$site_tongji}                  / Page statistics code

{$site_seo_title}               /SEO title

{$site_seo_keywords}            /SEO keyword

{$site_seo_description}         /SEO describe

5 Loading template resources

1. Load template Public Picture below

<img src="__TMPL__Public/images/prv/human-img-3.png"/>

__TMPL__  This is a template constant , Represents the root directory of the current template

2. Load template Public Under the css,js

<link href="__TMPL__Public/css/demo.css" rel="stylesheet" type="text/css" /><script type="text/javascript" src="__TMPL__Public/js/jquery.js" ></script>_

Two 、 Make home page content

1 Make slides

<php>

$home_slides=sp_getslide($top_slides);

$home_slides=empty($home_slides)?$default_home_slides:$home_slides;

$home_slides=($home_slides);

$result=array_pop($home_slides);

</php>

<div class="carousel slide" id="ad4" data-ride="carousel" data-interval="3000">

<div class="carousel-inner">

<div class="item active">

<a href="{$result.slide_url}"><img src="{$result['slide_pic']}" alt=""></a>

</div>

<foreach name="home_slides" item="vo">

<div class="item">

<a href="{$vo.slide_url}"><img src="{$vo['slide_pic']}" alt=""></a>

</div>

</foreach>

</div>

Configure the default slide  config.html

$default_home_slides=array(

array(

"slide_name"=>"ThinkCMFX1.6.0 Released !",

"slide_pic"=>$tmpl."Public/images/demo/1.jpg",   "slide_url"=>"", ),

array(aaaa

"slide_name"=>"ThinkCMFX1.6.0 Released !",

"slide_pic"=>$tmpl."Public/images/demo/2.jpg",   "slide_url"=>"",   )  )

2 Make the inside page of the article -- Paged articles show

<php>

$posts=sp_sql_posts('cid:6;field:post_title,post_content;order:listorder asc');

Print($posts);  // You can print out the results  field  Query range   cid  Article management center id Number  order Sort

</php>

<foreach name="posts" item="vo">  /*  Traversal array  */

{$vo.term_id }<br>     The article classification id

{$vo.post_author }<br>   The authors id, Backstage Administrator , Corresponding to table users Inside ID;

{$vo.post_keywords }<br>

{$vo.post_date }<br>   Article release date   Format 2014-01-01 00:00:00

{$vo.post_content }<br>    Article content

{$vo.post_title }<br>    Article title

{$vo.post_excerpt }<br>   Article summary

{$vo.post_modified}<br>    Article update date

{$vo.user_nicename }<br>    Administrator name

{$vo.user_email }<br>    Administrator mailbox

{$vo.post_source}<br>       Source of the article

<php>

$smeta=json_decode($vo['smeta'],true);/*  hold smeta Convert to array  */

</php>

<img src="{:sp_get_asset_upload_path($smeta['thumb'])}"/>

</foreach>

<php>      $photo=$Portal_index['Cat']['Photo']; $contentPh=sp_sql_posts_paged("cid:$photo;field:post_title,term_id,smeta;order:post_date desc;",'4');  </php>

<foreach name="contentPh['posts']" item="vo">

<php>  $smeta=json_decode($vo['smeta'],true);/*  hold smeta Convert to array  */  </php>

<div class="col-md-3 col-xs-12"> <div class="drop">

<a href="{:leuu('article/index',array('id'=>$vo['id']))}" target="_blank">

<img src="{:sp_get_asset_upload_path($smeta['thumb'])}" alt="" class="img-responsive">  </a><a href="{:leuu('article/index',array('id'=>$vo['id']))}">

<p class="drop-u" target="_black">{$vo.post_title}</p> </a>  </div>   </div>  </foreach>

  1. Config.html

//  Home configuration

$Portal_index= array(

'Article'=>array(),

'Page'=>array(),

'Cat'=>array(

'Photo'=>5,     // partners

'Newscenter'=>8,     // Information Center

'Advantage'=>2,       // Product advantage

'Industry'=>7 ,        // Industry trends

'Question'=>9   // Troubleshooting  ),   );

$top_slides='top_slides';   // Slide settings

$default_home_slides=array(    array(

"slide_name"=>" advertisement 1",

"slide_pic"=>"banner-bg.png",

"slide_url"=>"",),);

3、 ... and 、 Create a landing page  <a href="{:u('user/login/index')}">

1 frame  User/login.html

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>{$site_seo_title} {$site_name}</title>

<meta name="keywords" content="{$site_seo_keywords}" />

<meta name="description" content="{$site_seo_description}">

<tc_include file="Public:head"/><!--head part       Load public CSS and js etc.  -->

</head>

<body>

<tc_include file="Public:header" /><!--header part       Load navigation, etc  -->

{content}

<tc_include file="public:footer"/><!--footer part       Load the common bottom , Links, etc  -->

<tc_include file="Public:scripts"/><!--scripts part       Load public js etc.  -->

</body>

</html>

2 Content

<form class="J_ajaxForms" action="{:U('user/login/dologin')}" method="post">

<label for="input_username"> account number </label>

<input type="text" id="input_username" name="username" placeholder=" Please enter the user name or email " class="span3">

<label for="input_password"> password </label>

<input type="password" id="input_password" name="password" placeholder=" Please input a password " class="span3">

<label for="input_verify"> Verification Code </label>

<input type="text" id="input_verify" name="verify"  placeholder=" Please enter the verification code " class="span3"> {:sp_verifycode_img('length=4&font_size=15&width=100&height=35&charset=1234567890')}

<label for="input_repassword"></label>

<label class="checkbox persistent"><input type="checkbox" name="terms" value="1"> I agree with <a href="#"> Website content terms of service </a></label>

<button class="btn btn-primary J_ajax_submit_btn" type="submit"> determine </button>

</form>

3 controller

namespace User\Controller;

use Common\Controller\HomeBaseController;

class LoginController extends HomeBaseController {

function index(){

if(sp_is_user_login()){ // Jump to the home page when you have logged in

redirect(__ROOT__."/");   }else{

$this->display(":login");    } }

function active(){   $this->check_login(); $this->display(":active"); }

function doactive(){ $this->check_login(); $this->_send_to_active();

$this->success(' Activation email sent successfully , Please login again to activate !',U("user/index/logout")); }

function forgot_password(){ $this->display(":forgot_password"); }

function doforgot_password(){   if(IS_POST){ if(!sp_check_verify_code()){

$this->error(" Verification code error !"); }else{  $users_model=M("Users");

$rules = array(

//array( Validation fields , Validation rule , Error message , Validation conditions , Additional rules , Verification time )

array('email', 'require', ' The mailbox cannot be empty !', 1 ),

array('email','email',' The email format is incorrect !',1), //  verification email Whether the field format is correct );

if($users_model->validate($rules)->create()===false){ $this->error($users_model->getError());

}else{   $email=I("post.email");

$find_user=$users_model->where(array("user_email"=>$email))->find();

if($find_user){ $this->_send_to_resetpass($find_user);

$this->success(" Password reset email sent successfully !",__ROOT__."/"); }else {

$this->error(" Account does not exist !"); } } } } }

// validate logon

function dologin(){ if(!sp_check_verify_code()){   $this->error(" Verification code error !");   }

$users_model=M("Users");

$rules = array( //array( Validation fields , Validation rule , Error message , Validation conditions , Additional rules , Verification time )

array('username', 'require', ' User name or mailbox cannot be empty !', 1 ),

array('password','require',' The password cannot be empty !',1),    );

if($users_model->validate($rules)->create()===false){ $this->error($users_model->getError());  }

extract($_POST);

if(strpos($username,"@")>0){// Email login $where['user_email']=$username;

}else{   $where['user_login']=$username;    }

$users_model=M('Users');    $result = $users_model->where($where)->find();

$ucenter_syn=C("UCENTER_ENABLED");  $ucenter_old_user_login=false;     $ucenter_login_ok=false;

if($ucenter_syn){  setcookie("thinkcmf_auth","");   include UC_CLIENT_ROOT."client.php";

list($uc_uid, $username, $password, $email)=uc_user_login($username, $password);

if($uc_uid>0){ if(!$result){

$data=array( 'user_login' => $username, 'user_email' => $email,

'user_pass' => sp_password($password), 'last_login_ip' => get_client_ip(),

'create_time' => time(), 'last_login_time' => time(), 'user_status' => '1',);

$id= $users_model->add($data); $data['id']=$id; $result=$data; }

}else{   switch ($uc_uid){  case "-1":// The user doesn't exist , Or deleted

if($result){// This app already has this user

if($result['user_pass'] == sp_password($password)){// This app already has this user , And the password is correct , Synchronize users

$uc_uid2=uc_user_register($username, $password, $result['user_email']);

if($uc_uid2<0){  $uc_register_errors=array(

"-1"=>" Illegal user name ", "-2"=>" Contains words that are not allowed to register ",

"-3"=>" The user name already exists ", "-4"=>"Email Wrong format ",

"-5"=>"Email Registration is not allowed ", "-6"=>" The Email Has been registered ", );

$this->error(" Failed to synchronize user --".$uc_register_errors[$uc_uid2]); }

$uc_uid=$uc_uid2; }else{ $this->error(" Wrong password !"); } } break;

case -2:// Wrong password

if($result){// This app already has this user

if($result['user_pass'] == sp_password($password)){// This app already has this user , And the password is correct , Synchronize users

$uc_user_edit_status=uc_user_edit($username,"",$password,"",1);

if($uc_user_edit_status<=0){   $this->error(" Login error !");   }

list($uc_uid2)=uc_get_user($username);  $uc_uid=$uc_uid2;

$ucenter_old_user_login=true;

}else{ $this->error(" Wrong password !"); }

}else{   $this->error(" Wrong password !"); }break; } }

$ucenter_login_ok=true; echo uc_user_synlogin($uc_uid);   }   //exit();

if($result != null)  { if($result['user_pass'] == sp_password($password)|| $ucenter_login_ok){

$_SESSION["user"]=$result; // Write this login information

$data = array( 'last_login_time' => date("Y-m-d H:i:s"), 'last_login_ip' => get_client_ip(), );

$users_model->where("id=".$result["id"])->save($data);

$redirect=empty($_SESSION['login_http_referer'])?__ROOT__."/":$_SESSION['login_http_referer'];

$_SESSION['login_http_referer']="";   $ucenter_old_user_login_msg="";

if($ucenter_old_user_login){  //$ucenter_old_user_login_msg=" Old users, please after jump , Landing again ";} $this->success(" Login verification successful !", $redirect);

}else{ $this->error(" Wrong password !"); }

}else{   $this->error(" The username does not exist !");  }   }

......

Four 、 Create registration page    <a href="{:U('user/register/index')}">

1 The framework is the same as the landing page

2    Registration page   User/register.html

<form class="form-horizontal J_ajaxForm" action="{:U('user/register/doregister')}" method="post">

<label class="control-label" for="input_username"> account number </label>

<input type="text" id="input_username" name="username" placeholder=" Please enter your account number " class="span3">

<label class="control-label" for="input_email"> mailbox </label>

<input type="text" id="input_email" name="email" placeholder=" Please enter email address " class="span3">

<label class="control-label" for="input_password"> password </label>

<input type="password" id="input_password" name="password" placeholder=" Please input a password " class="span3">

<label class="control-label" for="input_repassword"> Repeat the password </label>

<input type="password" id="input_repassword" name="repassword" placeholder=" Please enter the duplicate password " class="span3">

<label class="control-label" for="input_verify"> Verification Code </label>

<input type="text" id="input_verify" name="verify" placeholder=" Please enter the verification code " class="span3"> {:sp_verifycode_img('length=4&font_size=15&width=100&height=35&charset=1234567890')}

<label class="control-label" for="input_repassword"></label>

<label class="checkbox persistent"><input type="checkbox" name="terms" value="1"> I agree with <a href="#"> Website content terms of service </a></label>

<button class="btn btn-primary J_ajax_submit_btn" type="submit" data-wait="1500"> Make sure to register </button>

</form>

5、 ... and 、  Contact us

1 listercontroller.class.php

class ListController extends HomeBaseController {

public function index() {   $term=sp_get_term($_GET['id']); // Inside the article

if(empty($term)){ header('HTTP/1.1 404 Not Found');   header('Status:404 Not Found');

if(sp_template_file_exists(MODULE_NAME."/404")){   $this->display(":404");  }

return ; }

var_dump($term);   $tplname=$term["list_tpl"];

$tplname=sp_get_apphome_tpl($tplname, "list"); $this->assign($term);

$this->assign('cat_id', intval($_GET['id'])); $this->display(":$tplname");  }

$term=sp_get_term($_GET['id']); Print the results

array(15) { ["term_id"]=> string(1) "4"      ["name"]=> string(12) " Contact us "

["slug"]=> string(0) ""    ["taxonomy"]=> string(7) "article"   ["description"]=> string(0) ""

["parent"]=> string(1) "0"   ["count"]=> string(1) "0"      ["path"]=> string(3) "0-4"

["seo_title"]=> string(0) ""       ["seo_keywords"]=> string(0) ""

["seo_description"]=> string(0) "" ["list_tpl"]=> string(5) "index"

["one_tpl"]=> string(7) "article"   ["listorder"]=> string(1) "0"    ["status"]=> string(1) "1" }

2    About us

<php $contentAb=sp_sql_posts_paged("cid:$Portal_about;field:post_title,post_content,post_excerpt;order:post_date desc;";   </php>

<foreach name="contentAb['posts']" item="vo">

<div class="jianjie"><p>{$vo[post_title]}</p>

<span>{$vo.post_excerpt }</span>    <span>{$vo.post_content }</span>

</div>

</foreach>

6、 ... and 、 Create a personal Center

1    Log in and verify   LoginController.class.php---function dologin()

$users_model=M("Users");

$rules = array(   //array( Validation fields , Validation rule , Error message , Validation conditions , Additional rules , Verification time )

array('username', 'require', ' User name or mailbox cannot be empty !', 1 ),

array('password','require',' The password cannot be empty !',1),);

if($users_model->validate($rules)->create()===false){

$this->error($users_model->getError());   }

extract($_POST);

if(strpos($username,"@")>0){// Email login    $where['user_email']=$username;

}else{   $where['user_login']=$username;    }

If  (strpos($username,"@")>0){// Email login    $where['user_email']=$username;

}else{    $where['user_login']=$username; }

2     Login information will be displayed after login  header.html   script.html

<div id="main-menu-user">

<div  class='userout user' >  <!-- Not logged in yet -->

<ul class="nav navbar-nav  navbar-right">

<li><a href="{:u('user/register/index')}" data-toggle="dropdown"> register </a> </li></ul>

<ul class="nav navbar-nav  navbar-right">

<li><a href="{:u('user/login/index')}"  data-toggle="dropdown"> land </a></li></ul>

<ul class="nav navbar-nav  navbar-right" style="margin-top:10px">

<li > <img src="__TMPL__/Public/img/headicon.png" class="headicon"/> </li> </ul>

</div>

<div class="userlogin user" ><!-- Already logged in -->

<ul class="nav navbar-nav  navbar-right">

<li><a href="{:u('user/index/logout')}" data-toggle="dropdown"> sign out </a></li></ul>

<ul class="nav navbar-nav  navbar-right"><li>

<a href="{:u('user/center/index')}" data-toggle="dropdown" class="user-nicename"></a>

</li></ul>

<ul class="nav navbar-nav  navbar-right" style="margin-top:10px">

<li ><img src="" class="headicon"/> </li></ul>

</div> </div>

<script>

$(function () { /* Control the navigation bar to show login or personal center */

$.post("{:U('user/index/is_login')}",{},function(data){

if(data.status==1){

if(data.user.avatar){  $("#main-menu-user ul li .headicong").attr("src",data.user.

avatar.indexOf("http")==0?data.user.avatar:"__UPLOAD__avatar/"+data.user.avatar); }

$("#main-menu-user ul li .user-nicename").text(data.user.user_nicename!=""?data.use

r.user_nicename:data.user.user_login);

$("#main-menu-user .userlogin").show();   $("#main-menu-user .userout").hide(); }

if(data.status==0){  $("#main-menu-user .userout").show();

$("#main-menu-user .userlogin").hide(); }   });   });    </script>

At the same time, the corresponding transmission value IndexController.class.php--function is_login()

function is_login(){   if(sp_is_user_login()){

$this->ajaxReturn(array("status"=>1,"user"=>sp_get_current_user()));

}else{   $this->ajaxReturn(array("status"=>0,"info"=>" This user is not logged in !"));   }   }

Thinkcmf More related articles on secondary development

  1. Navisworks API Simple secondary development ( Customize toolbars )

    stay Navisworks There is a toolbar on the right side of the interface when the software is running . It's more convenient . But in the second development, I didn't know in Api There is a call for . If any netizen knows, please let me know . thank you . I set up a tool by myself . The interface is ugly ! No artists . Code : ...

  2. [ Serial ]《C# Communications ( Serial port and network ) The design and implementation of the framework 》- 12. Secondary development and application

    Objective        record Chapter 12      Secondary development and application ... 2 12.1        Project configuration ... 3 12.2        Reference related components ... 4 12.3        Build the main program ... 5 ...

  3. OBS-Studio Secondary development records

    OBS-Studio It's a cross platform , Open source live video client software . The company needs to redevelop it , The purpose of development is to use its screen recording function . The requirement of development is : Customize a new interface , What you see is what you get ,window The system is compatible . Development step ...

  4. Piglets cms How to paginate in the second development of wechat

    $db=D('Classify'); $zid=$db->where(array('id'=>$this->_GET('fid'),'token'=>$this->tok ...

  5. Undertaking AutoCAD Secondary development project

    I have many years of experience CAD Development experience , Complete multiple tasks independently CAD Secondary development projects . be familiar with .net And Asp.net Development technology , and Lisp Development technology . Now we have a studio , Independently undertake CAD Secondary development projects . Provide source code and development documents after closing , In need ...

  6. 【 Industrial serial port and network software communication platform (SuperIO) course 】 7、 ... and . Secondary development service driven

    SuperIO Download relevant information :http://pan.baidu.com/s/1pJ7lZWf 1.1    The role of the service interface Around the data collected by the device driver module , Provide a variety of application services on demand , for example : Data upload service . Count ...

  7. 【 Industrial serial port and network software communication platform (SuperIO) course 】 3、 ... and . Secondary development process

    1.1    Secondary development flow chart 1.2    Reference related components find “ Development kit ”, Refer to the related components inside . Here's the picture : 1.3    Develop device driver module 1.3.1    Develop the sending protocol driver Inherit SuperIO.Devi ...

  8. Civil 3D API Secondary development learning guide

    Civil 3D Built on AutoCAD and Map 3D above , I'm learning Civil 3D API Before redevelopment , You need to understand at least AutoCAD API Secondary development , You can refer to AutoCAD .NET API The second time ...

  9. visio Secondary development —— The line segment of drawing analysis

    Many bloggers , In fact, it's a good habit , When I was in college, my tutor asked me to write , But it's just laziness , In College , Who's not Warcraft or LOL Well , Is that so? , Ha ha ha . Okay , Next to the last one visio Secondary development —— Drawing analysis , I continue to write . Abstract : ( Please forward ...

Random recommendation

  1. filter( Filter ) attribute Inside information Do not reprint Thank You for Your Cooperation

    Filter describe none The default value is , There is no effect . blur(px) Set the image to Gaussian Blur ."radius" One value sets the standard deviation of the Gaussian function , Or how many pixels on the screen are fused together , So the bigger the value, the more fuzzy ...

  2. leetcode 106 Construct Binary Tree from Inorder and Postorder Traversal----- java

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  3. 2014 Multi school scene seven 1005 || HDU 4939 Stupid Tower Defense (DP)

    Topic link The question : length n Company , From the beginning to the end , It costs... To go through each unit length t second , There are three kinds of towers : Red tower : When passing through the unit where the tower is located , Every second you get x Point injury . Green tower : Each unit of length after the tower passes through will experience... Per second y Point injury ...

  4. 6 It's kind of cool CSS3 Button border animation effects

    6 It's kind of cool CSS3 Button border animation effects Button border animate Mouse over the button below to see the effect ! Draw Draw Meet Center Spin Spin Circle Spin T ...

  5. idea Some of the settings for

    stay File->Settings->Appearance & Behavior->System Settings->Updates Next cancel Automatically che ...

  6. ESP8266 Serial port and MQTT The server sends messages to each other ( Version of a ) Pure transmission + preservation WIFI Account information

    The goal is To make a ESP8266 Serial port and MQTT A little bit of mutual transmission WIFI, You can use your phone to modify the router it's connected to , Thus, the module can be arbitrarily loaded into a variety of serial port transmission MCU , Complete the hardware to cloud transmission . 1 A physical picture 2 MQTT Web testing clients ...

  7. MT【30】 The second definition of ellipse is to solve the problem

    problem : What is the region represented by the above formula ? answer : Using the second definition of ellipse, it is easy to know that it is ellipse when equal sign is taken , And make $y$ Tend to $+\infty$ Time inequality doesn't hold , So it can be judged as the inner region of the ellipse . review : utilize mathmatics Software is easy to get

  8. pure java Realize the mail sending service ( It's easy to use )

    I tested it today java Code to send limited services , It's simple . Post code directly : import com.sun.mail.util.MailSSLSocketFactory; import javax.ma ...

  9. linux mysql5.7 install 、 Boot up

    One . install wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz h ...

  10. 【Luogu】P2709 Small B Of ( Mo team algorithm )

    Topic link md,1A The rate is equal to 0. Bored to death . Finally, we got a team qwq. First, divide the interval into blocks, and then take the block number as the first keyword , The right endpoint is the second keyword sort , And then every time the endpoint moves 1 fool around with . then …… Just wa 了 . And then there are a lot of details to pay attention to q ...