2022年1月

//...
const onLoad = async () => {
  try {
      //1.异步调用接口取服务端数据
      const params = {
      id: props.category.id,
      pageNumber: state.pageNumber || 1,
      };
      const { data } = await getArticle(params);
      const results = data.list; //list为后端返回数组
      //2.将取回的数据push到本实例数组内
      state.list.push(...results);
      //3.数据加载完成的标记
      state.loading = false;
      //当全部数据加载完成后,将finished为true
      if(results.length > 0) {
        state.pageNumber = data.p_num;
      } else {
        state.finished = true;
      }
  } catch (err) {
    state.error = true;
    state.loading = false;
  }
}
//...

spl_autoload_register() 函数可以指定一个函数来替代 __autoload() 函数的功能。语法格式如下:

spl_autoload_register([$autoload_function [, $throw = true [, $prepend = false ]]])

参数说明如下:

  • $autoload_function:要替代 __autoload() 函数的函数名称,也可以是一个匿名函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数 spl_autoload()
  • $throw:用来设置 $autoload_function 无法成功注册时,spl_autoload_register() 函数是否抛出异常;
  • $prepend:如果是 true,则 spl_autoload_register() 函数会添加 $autoload_function 函数到队列之首,否则添加到队列尾部。
注意:与 __autoload() 函数不同,spl_autoload_register() 可以多次定义。
<?php
    spl_autoload_register('loadClass');
    function loadClass($class){
        $file = './'.$class.'.php';
        include_once($file);
    }

    $obj = new Demo();
?>
运行上面的代码同样需要上面示例中用到的 Demo.php 文件。

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,是一种动态获取的信息以及动态调用对象的方法的功能。

理解go语言的接口。很多跟我一样的初学者被go语言接口搞得云里雾里,也会定义,也使用了,就是不能完全理解接口有什么用,有什么意义。
刚看到一句话,我觉得非常好:“接口的意义就是描述数据类型的行为,以及数据类型的共性特征。”我们拿到一个数据,知道它实现了哪个接口,就知道用什么方法操作它了。
也就是通过数据所实现的接口,我们就知道了数据得类型,进而就知道如果去操作了。我们不能对石头执行吃的操作,但是可以对米饭执行吃的方法。

  1. INT等整型不要采用无符号的,计算增加会减少时候如果是负数会报错。
  2. 自增用8个字节的BIG INT,而不要用四个字节INT,自增在MySQL 8.0前都会有回溯问题。
  3. 字符集用UTF8MB4字符编码。
  4. 日期类型用DATETIME,精确到毫秒用DATETIME(6),不建议使用INTTIMESTAMP
  5. JSON存储非频繁更新的结构化数据,比如用户标签等。
  6. 每张表一定要有一个主键,核心表要有全局唯一字段(比如雪花算法生成id或有序UUID)作为主键。
  7. 对日志,监控类的表,可以使用压缩设计,提升存储效率。推荐使用透明页压缩。
  8. 敏感字段要加密,动态盐+非固定加密算法( AES256等)+多轮加密。
  9. Mysql中通过KV方式访问表中数据,若只是简单的SETGET,可以转成MemcachedKV方式,减少开销,提升50%左右性

module.exports = {
    // 基本路径 baseURL已经过时
    publicPath: './',
    // 输出文件目录
    outputDir: 'dist',
    // eslint-loader 是否在保存的时候检查
    lintOnSave: true,
    // use the full build with in-browser compiler?
    // https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
    // compiler: false,
    // webpack配置
    // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
    chainWebpack: () => {},
    configureWebpack: () => {},
    // vue-loader 配置项
    // https://vue-loader.vuejs.org/en/options.html
    // vueLoader: {},
    // 生产环境是否生成 sourceMap 文件
    productionSourceMap: true,
    // css相关配置
    css: {
        // 是否使用css分离插件 ExtractTextPlugin
        extract: true,
        // 开启 CSS source maps?
        sourceMap: false,
        // css预设器配置项
        loaderOptions: {},
        // 启用 CSS modules for all css / pre-processor files.
        modules: false
    },
    // use thread-loader for babel & TS in production build
    // enabled by default if the machine has more than 1 cores
    parallel: require('os').cpus().length > 1,
    // 是否启用dll
    // See https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#dll-mode
    // dll: false,
    // PWA 插件相关配置
    // see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
    pwa: {},
    // webpack-dev-server 相关配置
    devServer: {
        open: process.platform === 'darwin',
        disableHostCheck: true,
        host: 'xfcms-search.local',//如果是真机测试,就使用这个IP
        port: 80,
        https: false,
        hotOnly: false,
        before: app => {}
    },
    // 第三方插件配置
    pluginOptions: {
        // ...
    }
}

qx.JPG

  • 通过角色获取到用户 Roles-UserRoles-Users
  • 通过角色获取到导航菜单 Roles-NavigationRoles-Navigations
  • 通过角色获取到部门以及部门用户 Roles-RoleGroup-Groups-UserGroup-Users
  • 通过角色获取到授权应用 Roles-RoleApp

这个算是比较经典的了,需要的可能参考。

server
{
    listen 80;
    server_name xxx.webman.xxx;
    
    index index.html;
    root /server/webman/public;
    
    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header Host $http_host;
        
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-Scheme $scheme;
        
        if ($uri = /) {
            proxy_pass http://127.0.0.1:8787;
            break;
        }
        
        if (!-e $request_filename) {
            proxy_pass http://127.0.0.1:8787;
        }
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }
    
    access_log    /dev/null;
    error_log    /server/logs/webman.error.log;
}

class AccessControl implements MiddlewareInterface
{
    /**
     * @param Request $request
     * @param callable $next
     * @return Response
     */
    public function process(Request $request, callable $next) : Response
    {
        $response = $request->method() == 'OPTIONS' ? response('') : $next($request);
        $response->withHeaders([
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With,Origin',
            'Access-Control-Allow-Methods' => 'GET,POST,PUT,DELETE,OPTIONS',
        ]);
        return $response;
    }
}