辰迅云帮助中心

其他类

本篇文章给大家分享的是有关怎么在spring boot2中使用mybatis实现增删改查操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。新建springboot项目使用idea新建springboot项目(springboot项目快速搭建)(1)new project(2)gav设置2.2 项目整体图及说明2.2.1 整体图2.2.2 说明项目包含4大内容(1)pom.xmlmaven项目必备,用于定义项目、获取jar包、打包等。(2)项目配置文件有两个,一个是项目内配置文件;一个是用于mybatis-generate生成相关数据库操作文件。(3)spcrudapplication项目启动类,springboot项目必备。(4)springmvc对应类。包含controller、service、db等相关类。2.3 详细说明2.3.1 pom文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.1.7.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.laowang</groupId> <artifactId>spcrud</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spcrud</name> <description>Demo project for Spring Boot</description> <properties>  <java.version>1.8</java.version> </properties> <dependencies>  <!--1.web启动包 软件老王-->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency>  <!--2. 数据库 软件老王-->  <dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId>   <version>8.0.15</version>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-jdbc</artifactId>   <version>2.1.5.RELEASE</version>  </dependency>  <!--3. swagger 软件老王-->  <dependency>   <groupId>io.springfox</groupId>   <artifactId>springfox-swagger2</artifactId>   <version>2.7.0</version>  </dependency>  <dependency>   <groupId>io.springfox</groupId>   <artifactId>springfox-swagger-ui</artifactId>   <version>2.7.0</version>  </dependency>  <!--4.mybatis 软件老王-->  <!--mybatis-->  <dependency>  <groupId>org.mybatis.spring.boot</groupId>  <artifactId>mybatis-spring-boot-starter</artifactId>  <version>2.1.0</version> </dependency> </dependencies>  <!--5.打包 软件老王--> <build>  <resources>   <resource>    <directory>src/main/resources/</directory>   </resource>   <resource>    <directory>src/main/java</directory>    <includes>     <include>**/*.xml</include>    </includes>   </resource>  </resources>  <plugins>   <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>   </plugin>   <plugin>    <groupId>org.mybatis.generator</groupId>    <artifactId>mybatis-generator-maven-plugin</artifactId>    <version>1.3.5</version>    <configuration>     <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>     <verbose>true</verbose>     <overwrite>true</overwrite>    </configuration>   </plugin>  </plugins> </build></project>说明:包含5块内容(1)web启动包 ;(2)数据库 ;(3)swagger;(4)mybatis;(5)打包;2.3.2 资源文件(1)application.propertiesspring.datasource.url=jdbc:mysql://127.0.0.1:3306/ruanjianlaowang?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=root说明: 数据库配置文件,连接、用户名、密码(2)mybatis资源文件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <classPathEntry   location="E:\m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/> <context id="DB2Tables" targetRuntime="MyBatis3">  <!--<plugin type="org.mybatis.generator.plugins.ExamplePagePlugin"/>-->  <!--<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>-->  <commentGenerator>   <!-- 是否去除自动生成的注释 true:是 : false:否 -->   <property name="suppressAllComments" value="true"/>  </commentGenerator>  <jdbcConnection driverClass="com.mysql.jdbc.Driver"      connectionURL="jdbc:mysql://127.0.0.1:3306/ruanjianlaowang"      userId="root"      password="root">  </jdbcConnection>  <javaTypeResolver>   <property name="forceBigDecimals" value="false"/>  </javaTypeResolver>  <javaModelGenerator targetPackage="com.laowang.spcrud.db.entity" targetProject="src/main/java">   <property name="enableSubPackages" value="true"/>   <property name="trimStrings" value="true"/>  </javaModelGenerator>  <sqlMapGenerator targetPackage="com.laowang.spcrud.db.mapper" targetProject="src/main/java">   <property name="enableSubPackages" value="true"/>  </sqlMapGenerator>  <javaClientGenerator type="XMLMAPPER" targetPackage="com.laowang.spcrud.db.mapper" targetProject="src/main/java">   <property name="enableSubPackages" value="true"/>  </javaClientGenerator>  <table tableName="t_laowang" domainObjectName="TLaowang" enableInsert="true"    enableDeleteByPrimaryKey="true"    enableSelectByPrimaryKey="true"    enableUpdateByPrimaryKey="true"    enableCountByExample="false"    enableDeleteByExample="false"    enableSelectByExample="false"    enableUpdateByExample="false">   <property name="useActualColumnNames" value="false"/>   <generatedKey column="id" sqlStatement="MYSQL" identity="true"/>  </table> </context></generatorConfiguration>说明:包含几块内容:(a)classPathEntry 标签定义的是mysql-connector的jar包地址(b)jdbcConnection 数据库连接信息(c)javaModelGenerator、sqlMapGenerator、javaClientGenerator定义的是生成文件存放的地址;(d)table具体执行生成代码的tabel,增加几个标签,不生成example方法。2.3.3 启动类package com.laowang.spcrud;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import springfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication@EnableSwagger2@MapperScan("com.laowang.spcrud.db.mapper")public class SpcrudApplication {  public static void main(String[] args) {   SpringApplication.run(SpcrudApplication.class, args);  } }说明:@SpringBootApplication所有springboot项目启动必备@EnableSwagger2 启动swagger@MapperScan加载mpper文件。2.3.4 springmvc类(1)TestControllerpackage com.laowang.spcrud;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import springfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication@EnableSwagger2@MapperScan("com.laowang.spcrud.db.mapper")public class SpcrudApplication {  public static void main(String[] args) {   SpringApplication.run(SpcrudApplication.class, args);  } }ctroller类包含增删改查4个方法,使用了rest请求的方式。(2)TestServicepackage com.laowang.spcrud.service;import com.laowang.spcrud.db.entity.TLaowang;import com.laowang.spcrud.db.mapper.TLaowangMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class TestService {  @Autowired private TLaowangMapper tLaowangMapper;  /**   * 增加   * @auther: 软件老王   */ public void insertRecord(TLaowang tLaowang) {   tLaowangMapper.insert(tLaowang);  }  /**   * 删除   * @auther: 软件老王   */ public void deleteByPrimaryKey(int id) {   tLaowangMapper.deleteByPrimaryKey(id);  }  /**   * 更新   * @auther: 软件老王   */ public void updateByPrimaryKeySelective(TLaowang tLaowang) {   tLaowangMapper.updateByPrimaryKeySelective(tLaowang);  }  /**   * 查询   * @auther: 软件老王   */ public TLaowang selectByPrimaryKey(int id) {   return tLaowangMapper.selectByPrimaryKey(id);  } }TestService类,增删改查的服务类。(3)实体类TLaowangpackage com.laowang.spcrud.db.entity;public class TLaowang {  private Integer id;  private String name;  private String password;  public Integer getId() {   return id;  }  public void setId(Integer id) {   this.id = id;  }  public String getName() {   return name;  }  public void setName(String name) {   this.name = name == null ? null : name.trim();  }  public String getPassword() {   return password;  }  public void setPassword(String password) {   this.password = password == null ? null : password.trim();  } }操作实体类,包含三个字段:id、name、password(4)mpper接口类TLaowangMapperpackage com.laowang.spcrud.db.mapper;import com.laowang.spcrud.db.entity.TLaowang;public interface TLaowangMapper {  int deleteByPrimaryKey(Integer id);  int insert(TLaowang record);  int insertSelective(TLaowang record);  TLaowang selectByPrimaryKey(Integer id);  int updateByPrimaryKeySelective(TLaowang record);  int updateByPrimaryKey(TLaowang record); }(5)mapper接口xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.laowang.spcrud.db.mapper.TLaowangMapper"> <resultMap id="BaseResultMap" type="com.laowang.spcrud.db.entity.TLaowang"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="password" jdbcType="VARCHAR" property="password" /> </resultMap> <sql id="Base_Column_List"> id, name, password  </sql> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> select   <include refid="Base_Column_List" /> from t_laowang  where id = #{id,jdbcType=INTEGER}  </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from t_laowang  where id = #{id,jdbcType=INTEGER}  </delete> <insert id="insert" parameterType="com.laowang.spcrud.db.entity.TLaowang"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  SELECT LAST_INSERT_ID()  </selectKey> insert into t_laowang (name, password)  values (#{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR})  </insert> <insert id="insertSelective" parameterType="com.laowang.spcrud.db.entity.TLaowang"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  SELECT LAST_INSERT_ID()  </selectKey> insert into t_laowang  <trim prefix="(" suffix=")" suffixOverrides=",">  <if test="name != null">  name,   </if>  <if test="password != null">  password,   </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=",">  <if test="name != null">  #{name,jdbcType=VARCHAR},   </if>  <if test="password != null">  #{password,jdbcType=VARCHAR},   </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.laowang.spcrud.db.entity.TLaowang"> update t_laowang  <set>  <if test="name != null">  name = #{name,jdbcType=VARCHAR},   </if>  <if test="password != null">  password = #{password,jdbcType=VARCHAR},   </if> </set> where id = #{id,jdbcType=INTEGER}  </update> <update id="updateByPrimaryKey" parameterType="com.laowang.spcrud.db.entity.TLaowang"> update t_laowang  set name = #{name,jdbcType=VARCHAR},   password = #{password,jdbcType=VARCHAR}  where id = #{id,jdbcType=INTEGER}  </update></mapper>4与5在一起,这里使用了mybatis自动生成的增删改查方法,未做扩展,真实项目中除了这几个外,肯定还会做些扩展,比如根据name查询等。2.4 数据库建表语句CREATE TABLE `t_laowang` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(50) DEFAULT NULL,  `password` varchar(50) DEFAULT NULL,  PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;以上就是怎么在spring boot2中使用mybatis实现增删改查操作,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云资讯频道。...

本篇文章为大家展示了如何在vue项目中实现搜索节流,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<template> <input type="text"  v-model.trim="sse"></template><script>const delay = (function () {  let timer = 0 return function (callback, ms) {   clearTimeout(timer)   timer = setTimeout(callback, ms)  } })()export default {  name : 'search',  watch : {  sse () {  delay(() => {     this.search()    }, 500) }, methods :{  search () {     this.$axios      .get([url])      .then(response => {       // success     })      .catch(error => {       // error      alert('失败!')      }) } } } }</script>知识点扩展:关于各种Vue UI框架中加载进度条的正确使用这里拿MUSE UI 中的进度条举例  <mu-circular-progress :size="40" class="icon" v-if="isloading"/>  <div v-show="!isloading">    <p>内容</p>   </div>//数据初始化 data () {   return {    isloading: false  }  },  //页面加载之前 mounted () {    this.isloading = true   this.$axios     .get([      '/api/playlist/detail?id=' +       this.$route.params.id     ])     .then(response => {      // success     // console.log(response.data)     this.name = response.data.playlist.name      this.list = response.data.playlist.tracks      this.isloading = false    })     .catch(error => {      // error     alert('失败!')      console.log(error)     })   }页面加载之前this.isloading = truev-show='false'不显示页面当获取数据完毕后this.isloading = false进度条消失,页面显示上述内容就是如何在vue项目中实现搜索节流,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云。...

本篇文章为大家展示了使用EF6怎么实现一个多租户应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是多租户网上有好多解释,有些上升到了架构设计,让你觉得似乎非常高深莫测,特别是目前流行的ABP架构中就有提到多租户(IMustHaveTenant),其实说的简单一点就是再每一张数据库的表中添加一个TenantId的字段,用于区分属于不同的租户(或是说不同的用户组)的数据。关键是现实的方式必须对开发人员来说是透明的,不需要关注这个字段的信息,由后台或是封装在基类中实现数据的筛选和更新。基本原理从新用户注册时就必须指定用户的TenantId,我的例子是用CompanyId,公司信息做为TenantId,哪些用户属于不同的公司,每个用户将来只能修改和查询属于本公司的数据。接下来就是用户登录的时候获取用户信息的时候把TenantId保存起来,asp.net mvc(不是 core) 是通过 Identity 2.0实现的认证和授权,这里需要重写部分代码来实现。最后用户对数据查询/修改/新增时把用户信息中TenantId,这里就需要设定一个Filter(过滤器)和每次SaveChange的插入TenantId如何实现第一步,扩展 Asp.net Identity user 属性,必须新增一个TenantId字段,根据Asp.net Mvc 自带的项目模板修改IdentityModels.cs 这个文件// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. public class ApplicationUser : IdentityUser  {  public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)  {   // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType  var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);   // Add custom user claims here  userIdentity.AddClaim(new Claim("http://schemas.microsoft.com/identity/claims/tenantid", this.TenantId.ToString()));   userIdentity.AddClaim(new Claim("CompanyName", this.CompanyName));   userIdentity.AddClaim(new Claim("EnabledChat", this.EnabledChat.ToString()));   userIdentity.AddClaim(new Claim("FullName", this.FullName));   userIdentity.AddClaim(new Claim("AvatarsX50", this.AvatarsX50));   userIdentity.AddClaim(new Claim("AvatarsX120", this.AvatarsX120));   return userIdentity;  }  public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)  {   // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType  var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);   // Add custom user claims here  return userIdentity;  }  [Display(Name = "全名")]  public string FullName { get; set; }  [Display(Name = "性别")]  public int Gender { get; set; }  public int AccountType { get; set; }  [Display(Name = "所属公司")]  public string CompanyCode { get; set; }  [Display(Name = "公司名称")]  public string CompanyName { get; set; }  [Display(Name = "是否在线")]  public bool IsOnline { get; set; }  [Display(Name = "是否开启聊天功能")]  public bool EnabledChat { get; set; }  [Display(Name = "小头像")]  public string AvatarsX50 { get; set; }  [Display(Name = "大头像")]  public string AvatarsX120 { get; set; }  [Display(Name = "租户ID")]  public int TenantId { get; set; }  }  public class ApplicationDbContext : IdentityDbContext<ApplicationUser>  {  public ApplicationDbContext()   : base("DefaultConnection", throwIfV1Schema: false) => Database.SetInitializer<ApplicationDbContext>(null);  public static ApplicationDbContext Create() => new ApplicationDbContext();  }第二步 修改注册用户的代码,注册新用户的时候需要选择所属的公司信息[HttpPost]  [AllowAnonymous]  [ValidateAntiForgeryToken]  public async Task<ActionResult> Register(AccountRegistrationModel viewModel)  {   var data = this._companyService.Queryable().Select(x => new ListItem() { Value = x.Id.ToString(), Text = x.Name });   this.ViewBag.companylist = data;   // Ensure we have a valid viewModel to work with  if (!this.ModelState.IsValid)   {   return this.View(viewModel);   }   // Try to create a user with the given identity  try  {   // Prepare the identity with the provided information  var user = new ApplicationUser   {    UserName = viewModel.Username,    FullName = viewModel.Lastname + "." + viewModel.Firstname,    CompanyCode = viewModel.CompanyCode,    CompanyName = viewModel.CompanyName,    TenantId=viewModel.TenantId,    Email = viewModel.Email,    AccountType = 0      };   var result = await this.UserManager.CreateAsync(user, viewModel.Password);   // If the user could not be created  if (!result.Succeeded)   {    // Add all errors to the page so they can be used to display what went wrong   this.AddErrors(result);    return this.View(viewModel);   }   // If the user was able to be created we can sign it in immediately  // Note: Consider using the email verification proces  await this.SignInAsync(user, true);   return this.RedirectToLocal();   }   catch (DbEntityValidationException ex)   {   // Add all errors to the page so they can be used to display what went wrong  this.AddErrors(ex);   return this.View(viewModel);   }  } AccountController.cs第三步 读取登录用户的TenantId 在用户查询和新增修改时把TenantId插入到表中,这里需要引用Z.EntityFramework.Plus,这个是免费开源的一个类库,功能强大public StoreContext()   : base("Name=DefaultConnection") {   //获取登录用户信息,tenantid  var claimsidentity = (ClaimsIdentity)HttpContext.Current.User.Identity;   var tenantclaim = claimsidentity?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid");   var tenantid = Convert.ToInt32(tenantclaim?.Value);   //设置当对Work对象进行查询时默认添加过滤条件  QueryFilterManager.Filter<Work>(q => q.Where(x => x.TenantId == tenantid));   //设置当对Order对象进行查询时默认添加过滤条件  QueryFilterManager.Filter<Order>(q => q.Where(x => x.TenantId == tenantid));  }  public override Task<int> SaveChangesAsync(CancellationToken cancellationToken) {   var currentDateTime = DateTime.Now;   var claimsidentity = (ClaimsIdentity)HttpContext.Current.User.Identity;   var tenantclaim = claimsidentity?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid");   var tenantid = Convert.ToInt32(tenantclaim?.Value);   foreach (var auditableEntity in this.ChangeTracker.Entries<Entity>())   {   if (auditableEntity.State == EntityState.Added || auditableEntity.State == EntityState.Modified)   {    //auditableEntity.Entity.LastModifiedDate = currentDateTime;   switch (auditableEntity.State)    {    case EntityState.Added:     auditableEntity.Property("LastModifiedDate").IsModified = false;     auditableEntity.Property("LastModifiedBy").IsModified = false;     auditableEntity.Entity.CreatedDate = currentDateTime;     auditableEntity.Entity.CreatedBy = claimsidentity.Name;     auditableEntity.Entity.TenantId = tenantid;     break;    case EntityState.Modified:     auditableEntity.Property("CreatedDate").IsModified = false;     auditableEntity.Property("CreatedBy").IsModified = false;     auditableEntity.Entity.LastModifiedDate = currentDateTime;     auditableEntity.Entity.LastModifiedBy = claimsidentity.Name;     auditableEntity.Entity.TenantId = tenantid;     //if (auditableEntity.Property(p => p.Created).IsModified || auditableEntity.Property(p => p.CreatedBy).IsModified)    //{    // throw new DbEntityValidationException(string.Format("Attempt to change created audit trails on a modified {0}", auditableEntity.Entity.GetType().FullName));    //}    break;    }   }   }   return base.SaveChangesAsync(cancellationToken);  }  public override int SaveChanges() {   var currentDateTime = DateTime.Now;   var claimsidentity =(ClaimsIdentity)HttpContext.Current.User.Identity;   var tenantclaim = claimsidentity?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid");   var tenantid = Convert.ToInt32(tenantclaim?.Value);   foreach (var auditableEntity in this.ChangeTracker.Entries<Entity>())   {   if (auditableEntity.State == EntityState.Added || auditableEntity.State == EntityState.Modified)   {    auditableEntity.Entity.LastModifiedDate = currentDateTime;    switch (auditableEntity.State)    {    case EntityState.Added:     auditableEntity.Property("LastModifiedDate").IsModified = false;     auditableEntity.Property("LastModifiedBy").IsModified = false;     auditableEntity.Entity.CreatedDate = currentDateTime;     auditableEntity.Entity.CreatedBy = claimsidentity.Name;     auditableEntity.Entity.TenantId = tenantid;     break;    case EntityState.Modified:     auditableEntity.Property("CreatedDate").IsModified = false;     auditableEntity.Property("CreatedBy").IsModified = false;     auditableEntity.Entity.LastModifiedDate = currentDateTime;     auditableEntity.Entity.LastModifiedBy = claimsidentity.Name;     auditableEntity.Entity.TenantId = tenantid;     break;    }   }   }   return base.SaveChanges();  } DbContext.cs上述内容就是使用EF6怎么实现一个多租户应用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云。...

本篇文章给大家分享的是有关使用php怎么求斐波那契数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1 使用递归方法。  顺着思路去想, f(1)= 1; f(2) = 1 ; f(3) = f(2)+f(1)  【2】  f(4) = f(3)+f(2) 3//使用递归方式求斐波那契数public function fb($n){ //    if( $n <=2){       return 1;     }else{       return fb($n-1) + fb($n-2);     } }2使用递推方法。public function fb2($n){ //    if( $n <=2){       return 1;     }     $t1 = 1;$t2 = 1;     for($i=3;$i<$n;$i++){       $temp = $t1;       $t1 = $t2;       $t2 = $temp + $t2;     }     return $t1 + $t2; }最后,进行性能分析。明显的可以预测,递归方法,每多一层,就要向下递归两次。 约为 O(2 的N次方)  而递推算法为  O(n),实测代码如下。/**性能测试。*/function bench_profile($starttime , $flag = ''){   $endtime = explode(' ',microtime());   $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);   $thistime = round($thistime,3);   return $flag."-bench:".$thistime." sec"; }//使用递归算法。ini_set("max_execution_time" ,3600); $s = explode(' ',microtime());echo  bench_profile($s )."<br/>";   echo fb(35); //使用递归 耗时 40.925 sec  每往上一个数约慢两倍echo bench_profile($s )."<br/>";//使用递推算法。$s = explode(' ',microtime());echo  bench_profile($s )."<br/>";   echo fb2(35); //使用递推 时间极短。echo bench_profile($s )."<br/>";以上就是使用php怎么求斐波那契数,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云。...

这篇文章将为大家详细讲解有关linux如何使用grep命令查找文件内容,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在linux中,可以使用“grep 查找内容 文件”命令来查找文件内容;如果想要忽略大小写,则可使用“grep -i 查找内容 文件”命令;如果想搜索目录里所有文件,且结果中显示行号,则可使用“grep -nr 查找内容 *”命令。本教程操作环境:Red Hat Enterprise Linux 6.1系统、Dell G3电脑。Linux查找文件内容(grep)grep是Linux命令行下常用于查找过滤文本文件内容的命令。最简单的用法是:grep 查找内容 文件如果想忽略大小写,可以用-i参数:grep -i 查找内容 文件如果想搜索目录里所有文件,包括子目录的话,并且在结果中显示行号,可以用以下命令:grep -nr 查找内容 *grep的语法支持正则表达式,正则表达式有些复杂,以后再讲解。下面是一些有用的参数:-A num, --after-context=num: 在结果中同时输出匹配行之后的num行-B num, --before-context=num: 在结果中同时输出匹配行之前的num行,有时候我们需要显示几行上下文。-i, --ignore-case: 忽略大小写-n, --line-number: 显示行号-R, -r, --recursive: 递归搜索子目录-v, --invert-match: 输出没有匹配的行我们可以通过管道操作来让grep变得更强大,管道操作就是把前面一条命令的输出作为后面一条命令的输入,从而把很多简单的命令组合起来完成复杂的功能。例如,如果我们想查找包含apple的行,但又想过滤掉pineapple,可以用下面的命令:grep apple fruitlist.txt | grep -v pineapple如果我们想把搜索结果保存起来,那么可以把命令的标准输出重定向到文件:grep apple fruitlist.txt | grep -v pineapple > apples.txt重定向符号>和管道操作符号|的区别是,重定向后面接的是一个文件,它后面不能再接任何文件或命令了;而管道操作后面接的是命令,可以无限地接下去。如果想以追加方式写到文件,可以用>>。管道操作是Linux命令行的一种哲学,它是计算机技术中少有的能沿用几十年的技术之一。通过管道操作,一行命令可以完成Windows下上千行程序也不能完成的文本处理功能。关于“linux如何使用grep命令查找文件内容”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。...

您用于企业网站的托管类型会对搜索引擎排名产生重大影响。如果您的主机不是基于云的传统主机,那么切换到香港云服务器可能是您的企业将要采取的最重要的举措之一。毫无疑问,提高SEO排名是最困难的方法之一,使用香港云服务器可能会有所帮助。大多数网站所有者都知道,影响SEO排名的因素有很多。当一些因素得到改善和调整时,它可以对排名产生很大的影响。那么香港云服务器怎样影响搜索引擎优化的呢?  一、网页加载速度  当搜索引擎负责对网站进行排名时,负责发挥作用的主要因素之一是网站的加载速度。任何网站采用香港云服务器都可以在很大程度上帮助提高加载速度。这可能会对网站的排名产生重大影响。一个可以快速加载的站点对于访问者和企业来说要好得多。网站采用香港云服务器也将有助于提高用户友好性。它利用一种独特的技术来有效地分配所有在线资源。尽管网站所有者还需要做其他几件事,才能在搜索引擎中获得更好的排名,但是不可否认的事实是,选择基于云服务器将帮助您获得期望的结果。  二、防止僵尸程序  当您使用香港云服务器时,可以放心,您将受到僵尸程序的保护。僵尸程序是极其恶意的脚本,能够感染该网站,也可能损害您的排名。所有在线行业都宁愿花大力气保护自己免受这些威胁。不幸的是,很多人都不知道这些恶意脚本是如何负责工作的。而且,他们不知道机器人将要造成的破坏类型。您需要了解的一种特定机器人是抓取机器人。这些机器人可以在线查找信息,并轻松创建重复项。如果您的网站发生这种情况,可能会对排名产生负面影响。使用香港云服务器时,可以放心,您拥有最高管理权限,可以获得所有这些机器人和其他类型的机器人的额外保护。  三、可靠性  选择香港云服务器带来的另一个惊人优势无疑是可靠性。如果您的网站特别是由于托管不可靠而导致停机,则意味着您的搜索引擎优化排名将在很大程度上受到影响。但是,对于当前使用香港云服务器的用户而言,非常容易获得快速响应以及针对网站所面临的任何问题的帮助。与其他类型的托管服务相比,这无疑是香港云服务器的最重要优势之一。  四、工具和解决方案  香港云服务器的一大优势在于,借助云托管、资源、站点和IT系统都位于更好的位置。提供者可以选择为客户提供高质量的维护以及服务。当整个基础架构位于一个位置时,香港云服务器提供商可以轻松提供灵活的容量以及节省成本。除此之外,他们还将提供工具、管理控制台和仪表板,这些工具、管理控制台和仪表板负责提供远程管理所有网站的功能。  通常提供的用于网站优化的工具以及用于管理网站的控制台负责提供优势,尤其是在涉及搜索引擎优化时。这些工具可帮助网站所有者为SEO创建有效且独特的策略。在基于云的系统的帮助下,您还将获得用户的活动以及网络日志,可以对其进行研究和分析以进行必要的更改。日志负责提供有关SEO策略工作的重要输入。  五、更好的移动端管理  人们已经选择使用智能手机来完成任何事情,这已经不足为奇了。当前,它是主导整个互联网的最重要趋势之一。这就是为什么您制定的SEO策略需要对网站具有移动访问权限。但是,如果您没有针对智能手机使用而优化网站,那么您将失去访问者。当您使用香港云服务器,数据和分析都将可用,搜索引擎可以定制网站,从而使智能手机访问变得容易。  总之,那么香港云服务器怎样影响搜索引擎优化的呢?当涉及到搜索引擎优化时,您需要了解香港云服务器将是理想的选择。确保您了解香港云服务器的好处,以便可以确保做出正确的决定。...

当您经营一项业务时,多年来,销售人员不可避免地会以您为目标,试图让你购买大量技术或设备。其中大多数你不需要,但有一些可以真正提高您的业务运作方式,并与竞争对手相比可以给你更多优势。能给你带来巨大好处的一点就是使用香港服务器租用服务来部署您的跨境业务或外贸电商站点。  但究竟什么是香港服务器租用,为什么需要它们呢?当人们说"香港服务器租用"时,他们通常指的是个人或企业租用部署在香港数据中心内的物理服务器来部署您的站点或应用程序,进而为您的跨境在在线业务、外贸电商、娱乐游戏等场景提供可靠的运行环境、正常运行时间和快速可访问性。那么,为什么不选择其他共享服务器?香港服务器租用有哪些独特优势呢?  一、无需 ICP 备案,即开即用  香港服务器租用服务部署在香港数据中心,受辖于香港法律法规。相比国内服务器,香港服务器租用无需繁琐的 ICP 备案流程,即开即用,业务可以最快上线。  二、更高水平的性能  这是拥有香港服务器租用的主要好处。由于您不会与他人共享整台服务器的性能和资源,您将获得更好的性能、更快的速度和使用更多应用程序的机会。  三、具有长期成本效益的选择  最初似乎情况正好相反,但与共享服务器相比,香港服务器租用从长远来看是更具成本效益的解决方案,尤其当您部署的站点或应用具有高计算、大存储、高 IO 等需求时。由于它们在可用资源和运行能力方面提供更多,因此您将能够提供高于共享服务器的服务。当您对服务器的利用率更高,您的成本效益也将越高。此外,使用香港服务器租用将是您可以直接对接技术工程师,遇到任何问题都可以快速沟通处理,这意味着您的业务运行更加顺利,并且永远不会离线太久。  四、如果需要,易于修改  如果您需要定制硬件以满足您公司的定制要求,那么您确实需要香港服务器租用。共享的环境将为您提供更少的灵活性,并且需要您在预设条件下工作。  五、绝佳的灵活和可操控性  如果您有许多不同类型的应用程序需要同时运行,那么使用香港服务器租用比使用共享服务器好得多。如果要托管网站,同时还要运行 VPN、邮件服务器或某种云存储,则使用香港服务器租用至关重要。  六、安全可定制,安全性更高  鉴于香港服务器租用将只由您或您需要的人使用,因此确保一切保持安全会容易得多。您没有共享服务器,这一事实意味着您可以实施最高级别的安全策略,它不太可能导致数据泄露。  如需了解更多有关香港服务器租用的信息,欢迎随时联络辰讯云在线客服。辰讯云运营香港服务器租用托管服务逾 10 年,资源丰厚,技能娴熟。辰讯云专注于提供香港、韩国、美国等全球数据中心的优质资源供应服务。...

对于香港服务器来说,机房是其运转的灵魂。只有机房设备达到规范标准,才能使服务器正常运行。那香港机房要达到什么样的标准才能保证用户在使用香港服务器租用后,能保持长期稳定运行呢?下面就为大家带来几点香港机房标准介绍:  一、温度控制  假如没有空调控制系统,机房中服务器CPU的平均温度在60°C以上,箱体内部温度也都在40°C以上,如果保持这样的长期运行会对服务器的稳定性造成影响。所以香港机房在服务器运行环境中,都实行温度控制。使用大功率空调系统合理控制温度,把机房温度维持在15-23°C以内,而且也需配备温度感应器实时监测。  二、湿度控制  除了温度控制,香港机房的湿度控制也十分重要。若是把服务器一直放在一个干燥的环境中运行,这样容易使金属器械摩擦产生静电。静电对于服务器影响巨大,容易形成电流击穿点燃CPU等部件,不仅使服务器系统崩溃,甚至可能造成机房火灾等严重灾难。所以香港机房通过有专业设备进行湿度控制。    三、电力控制  香港机房的用电量巨大。要保持机房服务器稳定运行,电力稳定是基础。在机房中除了内部电力系统外,还需配备能够应付突发停电事故的UPS电源。而辰讯云的SDC 香港数据中心由中港电力、中华电力两大电力公司提供双路电力供应,配置多达 12 个电源备用发电机,具有足够的电源容量。保证机房的正常运行。  四、防尘  对于香港服务器这样的高性能机器来说,它也是一个很脆弱的机体。机房服务器,长期暴露在空气中,当空气中的灰尘达到一定量时,机器的电扇会不堪重负。而灰尘要是进入了主机,对于主板、CPU的寿命都将损耗。所以优质的香港机房,都会部署专业除尘设备,管理人员也会佩戴防尘罩等专业设备,尽可能减少灰尘的进入。  五、避光  阳光的直射会使机房的温度升高,进而导致服务器出现故障概率升高,这对于服务器的系统稳定性来说十分不利。而且直射的阳光对于机房中显示器也有危害,很容易使其使用寿命缩短。所以香港机房的避光必须要做到,哪怕一丝阳光也不要放进机房中。...

 香港云服务器基于先进的集群虚拟化和分布式存储技术,因此,当您使用香港云服务器来部署网站或应用时,您也将获得先进云技术带来的价值。如果您需要许多资源专用于您的网站或应用,同时兼备高速、性能、 控制、 灵活性, 那么没有其他选择比使用香港云服务器更完美。如果您需要经济实惠的托管服务类型,香港云服务器也是正确的选择。香港云服务器位于共享虚拟主机和专用独立服务器之间。在这里,您的优势是以低于香港物理服务器的价格获得私人资产。在云中,任何企业所需的速度和安全性都得到满足。  无需 ICP 备案,即开即用,业务可以最快上线,是香港云服务器区别于国内云服务器的最大优势。只要您经营的在线业务合法合规,可以在几分钟快速开通香港云服务器,并在最快时间内上线您的业务。  可靠性是香港云服务器享受的主要因素或好处之一。通过云平台架构,大规模物理服务器集群虚拟化形成云端资源池,用户可以从中快速调用 CPU、内存、存储和带宽等资源形成一台专用于该用户的香港云服务器。每台香港云服务器尤其自己的私人资源供其个人使用,相互隔离,不与任何用户共享。这使得香港云服务器比共享虚拟主机更可靠。带宽被邻居过度占用的情况不再是问题,因为您已分配独立的带宽资源来处理传入和传出流量的最高峰值。通常,访问者激增也不会感到任何滞后时间。  香港云服务器另一个优势是性能的提高。如果您有专用资源,您将获得更好的服务器性能。例如辰讯云香港云服务器提供 1~16 CPU核心、1~64GB 内存以及最高可达 3TB 的数据云盘,确保您获得充足的专用资源,供您自己的网站运行。同时,您还可以随时根据您的需求变化,在几分钟内快速扩容或缩减资源。因此,您可以得到更好的服务器性能,还可以提高处理能力和容量,从而加快您的网站加载速度。你们都将得到更高的转化率,这将改善您的业务。您的搜索引擎排名也将提高。  下一个重要好处是香港云服务器低成本性质的可负担性。使用香港云服务器,您始终会获得比共享虚拟主机更多的优势。下一个功能是自定义。当你使用香港云服务器时,你可以自由选择和部署操作系统、面板、软件和任意工具。您将获得专用自定义功能。  香港云服务器的另一个功能或好处是,您将拥有完整的最高的根访问权限。您可以完全访问和控制您的香港云服务器。如果您需要任何特定的应用程序来顺利运行您的业务,也可以根据需要在云服务器上执行应用程序安装。这可能是数据管理应用程序或某些类型的任意软件。您将完全了解所有应用程序在服务器上运行的信息、运行方法以及您希望如何配置安全性策略。这意味着您可以通过一个经济实惠的价格,获得对香港云服务器的完整最高管理权限。  可移植性是香港云服务器的另一个优势。如果使用香港服务器租用等物理服务器,可移植性将是影响服务器的重要问题之一。如果一个应用程序需要移植或移动到另一台云服务器。借助香港云服务器,您可以轻松地进行无缝移植。如果你想降级或升级你的香港云服务器,零停机时间,因为服务器之间的可移植性在这里很容易。  总之,每个公司或企业都希望保护其数据免受其他相邻服务器或其他病毒和恶意攻击的侵害。如果使用香港云服务器,这对您非常有帮助。香港云服务器提供更高程度的安全性。因为它允许您进行私人化的安全策略定制,因为服务器是专用于您的云服务器,数据和资源完全隔离和私密。在安全性方面没有任何妥协的情况下,您可以在香港云服务器上托管您的网站或应用。  在技术支持方面,您不应该担心。一旦选择辰讯云香港云服务器,我们为您提供周全的帮助。我们提供 24*7 金牌技术在线支持,以便在任何时候为您解决任何云服务器问题。我们技术娴熟、经验丰富的工程师始终关注解决用户面临的任何问题。我们主动执行云计算平台监控,实时扫描所有香港云服务器可能面临的任何威胁和突发状况。...

很多企业因为行业竞争激烈或处于对网站高可用性的考虑,为避免网站被恶意 DDoS 攻击而造成用户访问中断,往往选择弃用香港高防服务器部署网站和其他 Web 应用。从表面上看,DDoS攻击表现为访客流量大幅增加,但其实这些增长的访问量都是无效的虚假请求,这些虚假请求的涌入会阻挠真实用户的正常访问,造成网站流量通道被拥堵,导致网站访问变慢,甚至因无法处理过多的流量请求而崩溃。香港高防服务器可以有效防御这些 DDoS 攻击。那新用户在挑选香港高防服务器前该注意哪些点呢?下面就为大家带来相关介绍:  一、防御时效性  为了尽快摆脱DDoS攻击造成的恶劣影响,用户选择香港高防服务器时,都比较关心香港高防服务器究竟怎么才能部署以及是怎样防御攻击的。而辰讯云的香港高防服务器、香港高防IP部署完成后,可以在5分钟内快速检测攻击并秒级触发防护,全面防御已知的超过 25 种 DDoS 变种攻击及其任意组合。通过海量清洗带宽,即使遭遇 310G 大规模攻击,访客依然正常访问。  二、是否有误报  假如您很凑巧地真的成为DDoS的攻击目标,首先要清楚认识到DDoS的攻击防护很难。由于这些攻击是以模仿正常用户的行为习惯,很多防护技术低的高防服务器可能会出现误报,将正常访客当作 DDoS 攻击流量进行屏蔽。这将使您不得不花费更多的时间去处理正常客户的访问问题,并且造成潜在客户流失,损害网站声誉。所以寻找一家技术能力强的香港高防服务器供给商至关重要。  三、是否提供SLA服务水平协议  SLA服务级别协议其实就是用户和DDoS服务供给商之间的合同,以此约定网站的保护水平级别。简单来说,便是通过协议约定好用户如果遭受什么类型的攻击如何应对,购买的服务中包含多少Gbps的保护,如果被攻击时,防御无效,又会有哪些保障措施。除此之外,还可以约定如果攻击力度加强,该如何升级防御方案,如果攻击强度大于约定的防御计划,又该如何处理。  四、是否能提供详细的攻击报告  相信大多数的DDoS服务提供商都能做到这一点。有的香港高防服务器后台有客户仪表盘,能允许用户可实时监控,在攻击减轻后发送攻击报告。还能够根据要求发送其它报告。用户要与提供商紧密合作,才能深化了解处理 DDoS 攻击。拥有这类数据后才能有助于了解网站现在处于什么局面。假如你所处的行业经常被DDoS所攻击,而这些数据能帮助用户建立攻击时间表,跟着时间推移,用户可依据这些数据来制定具有针对性的系统,从而执行更好的防御。...