作者存档: amyflash - 第14页

修改Yii2的默认标题My Application

找到config->main.php,

return [
    'id' => 'app-frontend',
    'name'=>'自定义标题',//not my application
....

YII2 使用gii生成增删改查后,怎么去掉删除和更新按钮

view->index.php
['class' => 'yii\grid\ActionColumn', 'template' => '{view}']

YII2 save 和 insert 循环保存数据,出现间隔性丢失值

解决方案:
第一种方法

$model = new User();
foreach($data as $attributes)
{
$_model = clone $model;
$_model->setAttributes($attributes);
$_model->save();
}
第二种方法

$model = new User();
foreach($data as $attributes)
{
$model->isNewRecord = true;
$model->setAttributes($attributes);
$model->save() && $model->id=0;
}

win7 修改hosts 不起作用

解决方法:

1.该文件保存时未使用ansi编码进行保存,解决办法:更改文件编码为ansi进行保存

2.启用了DNS Client服务(该服务为DNS解析的缓存服务)解决办法:将该服务停用;如果该服务为自动启用,请改为手动启用。

修改docker里linux的时区

最近在docker下跑python的定时任务,要改下系统时区

Docker时间和宿主同步方法

  1.在run容器时添加参数挂载宿主时间配置:  -v /etc/localtime:/etc/localtime

  2.复制宿主localtime时间配置覆盖: 
docker cp /etc/localtime container_id:/etc/localtime

  3.在启动jar包添加时区参数:  -Duser.timezone=GMT+08

Docker容器设置时区

  #docker exec -it container_id /bin/bash            #进入容器命令

  #修改时区,设置为上海时区
  ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  或者
  cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

重启docker

systemctl restart docker#centos
sudo service docker restart# ubuntu

重启容器

docker restart containerid

检查是否修改成功

#date [-R]  #查看主机时间
#timedatectl #查看主机时区
#tzselect   #选择时区,5 选择亚洲 > 9 选择中国时区 -> 1选择北京时间 -> 1 选择Yes

Timezone offset does not match system offset: 0 != -32400. Please, check your config files

最近在docker下跑python的定时任务,
apscheduler使用uWSGI的mule模块部署的时候报错,

因为系统时区和代码运行时区不一样导致。

解决办法:在初始化的时候指定上海的时区
scheduler = BlockingScheduler(timezone="Asia/Shanghai")

立春饮食养生

少酸多甘,平抑肝火

《黄帝内经》记载:“春三月,此谓发陈,天地俱生,万物以荣。
”立春时节,在饮食上则应以补阳气为主。

常见的甘辛食物如:大枣、柑橘、蜂蜜、花生、香菜、韭菜、薏米等能助春阳,气虚症者可适当多吃;

而酸、涩、生冷、油腻之食物此时应尽量少吃。

另外,阳气虚弱者可酌情药补,如人参、西洋参、党参、太子参、冬虫夏草、黄芪等药物都是很不错的选择,它们有提高人体免疫力和抵御衰老之效。

温馨提示:

  • 平衡消化:多食谷类粗粮和多汁水果;适当吃葱姜蒜等调味品;少食油腻食物。
  • 平抑肝火:多吃性平味淡的蔬菜、野菜、食用菌;少吃易上火的羊肉,多吃易导致胃疼、便秘、咳嗽、黄痰、失眠、乳房胀痛、烦躁等症状。
  • 养护肝脏:黄豆芽能清热解毒、疏肝和胃、预防维生素B2缺乏,建议适当食用。

立春起居养生:

晚睡早起,切忌放纵民间有“立春雨水到,早起晚睡觉”的民谣。立春以后,天气转暖,阳气回升,万物生发。“晚睡早起”是一种比较科学且顺势而为的养生法,可防止人体受到春天气息的震荡,给人体一个生发机会。
立春时节睡眠最好的时间是晚上11点到早晨6点
温馨提示:立春时节,万物萌生,人体的性腺也进入活跃期。性腺可以分泌激素,使人感觉精力充沛,同时容易使人产生性冲动。立春时节如果不对性欲进行节制,则会耗气伤精,损伤阳气,严重还会导致阳痿。

立春运动养生

散步慢跑,踏青防花粉过敏
立春日出之后,日落之时是散步健身的大好时光,散步地点可选择河边湖旁、公园、林荫道、乡村小路为好,因为这些地方空气中负离子含量较高,空气清新。
散步途中建议采取全身活动,如合擦双手、按摩胸腹、捶打腰背、拍打全身等,有利于活血化瘀、通气血、生发阳气。

温馨提示:老年人以缓步为好,每分钟60~70步为宜;

中年和年轻人适合快步,每分钟120步为宜;
病后康复期或体力缺乏者适合逍遥步,且走且停,时快时慢。
慢跑是一项简单而实用的运动项目,对改善心肺功能、降低血脂、提高新陈代谢能力和增强机体免疫力、延缓衰老都有较好的作用。同时,慢跑还有助于调节大脑皮质的兴奋和抑制,促进胃肠蠕动,增强消化功能,消除便秘。

温馨提示:跑前做3-5分钟准备活动,速度每分钟100~200米,10分钟左右为好。

立春时节,踏青也是一项外出郊游、放松心情的最好时光,但是要避免出现季节性过敏症状,如花粉过敏、柳絮过敏等。

解决java.lang.IncompatibleClassChangeError

Caused by: java.lang.IncompatibleClassChangeError: class org.bouncycastle.asn1.DERObject has interface org.bouncycastle.asn1.ASN1Encodable as super class

solution:
找到jdk的安装目录,查找jdk1.8->jre->lib->ext,看下面是不是有个类似这样的bcpro-ext-jdk15.jar,(和bouncycastle相关的),删掉再重启idea就好了

fd-mobileUtil.ane

1.application.xml

<?xml version="1.0" encoding="utf-8"?>
<application xmlns="http://ns.adobe.com/air/application/28.0">
  <id>air.sms</id>
  <versionNumber>0.1</versionNumber>
  <supportedProfiles>mobileDevice</supportedProfiles>
  <filename>sms</filename>
  <name>sms</name>
  <android>
    <manifestAdditions><![CDATA[<manifest android:installLocation="auto">
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch" />
</manifest>]]></manifestAdditions>
  </android>
  <iPhone>
    <InfoAdditions><![CDATA[<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleBlackOpaque</string>
<key>UIRequiresPersistentWiFi</key>
<string>NO</string>
<key>UIApplicationExitsOnSuspend</key>
<true />
<key>UIDeviceFamily</key>
<array>
    <string>1</string>
</array>]]></InfoAdditions>
    <requestedDisplayResolution>high</requestedDisplayResolution>
  </iPhone>
  <initialWindow>
    <title>sms</title>
    <content>sms.swf</content>
    <visible>true</visible>
    <fullScreen>true</fullScreen>
    <!--<autoOrients>false</autoOrients>-->
    <!--<aspectRatio>landscape</aspectRatio>-->
    <renderMode>direct</renderMode>
    <!--<depthAndStencil>true</depthAndStencil>-->
    <!-- required for 3D -->
    <systemChrome>standard</systemChrome>
  </initialWindow>
  <icon>
    <image48x48>icons/icon_48.png</image48x48>
    <image57x57>icons/icon_57.png</image57x57>
    <image72x72>icons/icon_72.png</image72x72>
    <image76x76>icons/icon_76.png</image76x76>
    <image96x96>icons/icon_96.png</image96x96>
    <image114x114>icons/icon_114.png</image114x114>
    <image120x120>icons/icon_120.png</image120x120>
    <image144x144>icons/icon_144.png</image144x144>
    <image152x152>icons/icon_152.png</image152x152>
    <!--<image512x512>icons/icon_512.png</image512x512>-->
  </icon>
  <!-- 
    AIR options:
    http://livedocs.adobe.com/flex/3/html/File_formats_1.html#1043413

    AIR mobile options:
    http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html

    iOS icons guidelines:
    http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.html

    Android manifest documentation:
    http://developer.android.com/guide/topics/manifest/manifest-intro.html
    -->
  <extensions>
    <extensionID>com.techmx.ext.MobileUtil</extensionID>
  </extensions>

</application>

2.Package.bat
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir lib/

3.RunApp.bat

:target
::goto desktop
goto android-debug

sb3:Swagger2

Swagger2 是传说中的api文档管理利器,我们一起来学习下如何在sb2中集成swagger2

1.新建一个sb项目

依赖选择Web、LomBok 依赖,(JPA 和 Mysql)可选,系统自动生成的 Pom文件中没有swagger相关的配置,所以需要手动加入:

<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.4.0</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.4.0</version>
        </dependency>

有时候还需要加入maven-surefire-plugin,防test报错

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>

最后的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.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.study</groupId>
    <artifactId>sb4</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sb4</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.4.0</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>

    </build>

</project>

如果选了jpa和mysql,那么要在application.properties上加上如下配置:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=yourname
spring.datasource.password=yourcode
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2.在 SpringBoot 启动类(Application)的同级目录新建一个 Swagger 配置类,

注意 Swagger2 配置类必须与项目入口类 Application 位于同一级目录,否则生成 Api 文档失败,代码如下:

package com.study.sb4;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
//Swagger 配置类
@Configuration
// 启用 Swagger2
@EnableSwagger2
public class Swagger2 {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 文档信息对象
                .apiInfo(apiInfo())
                .select()
                // 被注解的包路径
                .apis(RequestHandlerSelectors.basePackage("com.study.sb4.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 标题
                .title("springboot 利用 swagger 构建 API 文档")
                // Api 文档描述
                .description("简单优雅的 restful 风格,https://amyflash.com")

                .termsOfServiceUrl("https://blog.csdn.net/turodog/")
                // 文档作者信息
                .contact(new Contact("harriet", "https://github.com/amyflash", "nbllq@qq.com"))
                // 文档版本
                .version("1.0")
                .build();
    }
}

3.配置被注解的 Controller 类

编写各个接口的请求参数,返回结果,接口描述等等,代码如下:

package com.study.sb4.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

@RestController
@RequestMapping("/test")
// @Api:修饰整个类,描述Controller的作用
@Api("TestController Api 接口文档")
public class TestController {
    // 使用该注解忽略这个API
    @ApiIgnore
    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String  jsonTest() {
        return " hi you!";
    }

    // @ApiOperation:描述一个类的一个方法,或者说一个接口
    @ApiOperation(value="无参get", notes="获取test")
    @RequestMapping(value={""}, method= RequestMethod.GET)
    public String getTest() {
        return "test get without param";
    }

    @ApiOperation(value="带参get", notes="根据id来获取test详细信息")
    @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "Integer",paramType = "path")
    @GetMapping("/{id}")
    public String findById(@PathVariable("id") Integer id){
        return "this is get id:"+id;
    }

    @ApiOperation(value="post一个参数", notes="postxx信息")
    // @ApiImplicitParam:一个请求参数
    @ApiImplicitParam(name = "param", value = "param", required = true, dataType = "String")
    //发送post请求
    @PostMapping("/p1")
    public String postTest1(@RequestBody String param){
        return "this is post one param :"+param;
    }

    /*@ApiOperation(value="删除学生", notes="根据url的id来指定删除的学生")
    @ApiImplicitParam(name = "id", value = "学生ID", required = true, dataType = "Integer",paramType = "path")
    @DeleteMapping("/{id}")
    public String deleteById(@PathVariable("id") Integer id){
        studentService.delete(id);
        return "success";
    }*/

   /* @ApiOperation(value="更新学生信息", notes="根据url的id来指定更新学生信息")
    // @ApiImplicitParams:多个请求参数
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "学生ID", required = true, dataType = "Integer",paramType = "path"),
            @ApiImplicitParam(name = "student", value = "学生实体student", required = true, dataType = "Student")
    })
    @PutMapping(value="/{id}")
    public String updateStudent(@PathVariable Integer id, @RequestBody Student student) {
        Student oldStudent = this.findById(id);
        oldStudent.setId(student.getId());
        oldStudent.setName(student.getName());
        oldStudent.setAge(student.getAge());
        studentService.save(oldStudent);
        return "success";
    }*/

}

4.启动项目

访问 http://localhost:8080/swagger-ui.html 地址,api文档就自动写好啦,nb得一塌糊涂,有没有!