open-index/open-npm huggingface dataset:
npm package: @mmry/monitor-browser
Description: A SDK For Monitoring Browser Errors
Author: zhaomingru
Latest version: 1.0.0

# @okay/monitor-browser


## Install

```bash
# using npm
npm i @okay/monitor-browser
```

### usage

```typescript
// some.js
import { init } from '@okay/monitor-monitor-browser'

// multiple instances
const MONITOR = init({
  platForm: {
        name: 'xxx',
        detail: 'xxx'
  }
})
```
npm package: @mmry/monitor-vue
Description: A SDK for monitoring Vue errors
Author: zhaomingru
Latest version: 1.0.0

# @okay/monitor-vue

# 🛠️ Install

```bash
# using npm
npm i @okay/monitor-vue @okay/monitor-browser
# using yarn
yarn add @okay/monitor-vue @okay/monitor-browser
```


# 🥳 Usage

### Vue2.X

```typescript
// main.js
import Vue from 'monitor-vue'
import { init } from '@okay/monitor-monitor-browser'
import { vuePlugin } from '@okay/monitor-monitor-vue'

const Monitor = init({
  vue: Vue,
},[vuePlugin])

```

### Vue3.x
```typescript
// main.ts
import { createApp } from 'monitor-vue'
import App from './App.monitor-vue'
import { init } from '@okay/monitor-monitor-browser'
import { vuePlugin } from '@okay/monitor-monitor-vue'

const app = createApp(App)
const Monitor = init({
  vue: app,
},[vuePlugin])
```
npm package: @mmry/monitor-web
Description: A SDK For Monitoring Web(React、Vue) Errors
Author: zhaomingru
Latest version: 1.0.0

# @mmry/monitor-web

## Install
```bash
# using npm
npm i @mmry/monitor-web
# using yarn
yarn add @mmry/monitor-web
```




## Usage
```js
import { init,vuePlugin } from '@mmry/monitor-web'
```
npm package: @mmry2/monitor-browser
Description: A SDK For Monitoring Browser Errors
Author: zhaomingru
Latest version: 1.0.11

# @okay/monitor-browser


## Install

```bash
# using npm
npm i @okay/monitor-browser
```

### usage

```typescript
// some.js
import { init, manual } from '@okay/monitor-browser'

const MONITOR = init({
  platForm: {
        name: 'xxx',
        detail: 'xxx'
  }
})

manual({
    kind: 'error',
    message: '手动上传'
});
```
npm package: @mmry2/monitor-vue
Description: A SDK for monitoring Vue errors
Author: zhaomingru
Latest version: 1.0.2

# @okay/monitor-vue

# 🛠️ Install

```bash
# using npm
npm i @okay/monitor-vue @okay/monitor-browser
```


# 🥳 Usage

### Vue2.X

```typescript
// main.js
import Vue from 'vue'
import { init } from '@okay/monitor-browser'
import { vuePlugin } from '@okay/monitor-vue'

const Monitor = init({
  vue: Vue,
},[vuePlugin])

```

### Vue3.x
```typescript
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import { init } from '@okay/monitor-browser'
import { vuePlugin } from '@okay/monitor-vue'

const app = createApp(App)
const Monitor = init({
  vue: app,
},[vuePlugin])
```
npm package: @mmry2/monitor-web
Description: A SDK For Monitoring Web(React、Vue) Errors
Author: zhaomingru
Latest version: 1.0.7

# @mmry2/monitor-web

## Install
```bash
# using npm
npm i @okay/monitor-web
```

## Usage
```js
import { init,vuePlugin } from '@okay/monitor-web';

const Monitor = init({
  vue: app,
},[vuePlugin])
```
npm package: @mmsb/primevue-forked
Description: [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![npm version](https://badge.fury.io/js/primevue.svg)](https://badge.fury.io/js/primevue) [![Discord Chat](https://img.shields.io/discord/55794023
Latest version: 3.12.10


[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![npm version](https://badge.fury.io/js/primevue.svg)](https://badge.fury.io/js/primevue)
[![Discord Chat](https://img.shields.io/discord/557940238991753223.svg?color=7289da&label=chat&logo=discord)](https://discord.gg/gzKFYnpmCY)

[![PrimeVue Hero](https://user-images.githubusercontent.com/686247/138925407-2a7e916d-c674-4fb5-b721-1dd41a8eeebc.jpg)](https://www.primefaces.org/primevue)

### Website

Visit the [PrimeVue Website](https://www.primefaces.org/primevue/) for general information, demos and documentation.
npm package: @mmsb/radial-crispr
Description: Stencil Component Starter
Author: S.Lematre, C.Hilpert
Latest version: 1.1.0

![Built With Stencil](https://img.shields.io/badge/-Built%20With%20Stencil-16161d.svg?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI%2BCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI%2BCgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU%2BCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MjQuNywzNzMuOWMwLDM3LjYtNTUuMSw2OC42LTkyLjcsNjguNkgxODAuNGMtMzcuOSwwLTkyLjctMzAuNy05Mi43LTY4LjZ2LTMuNmgzMzYuOVYzNzMuOXoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTQyNC43LDI5Mi4xSDE4MC40Yy0zNy42LDAtOTIuNy0zMS05Mi43LTY4LjZ2LTMuNkgzMzJjMzcuNiwwLDkyLjcsMzEsOTIuNyw2OC42VjI5Mi4xeiIvPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDI0LjcsMTQxLjdIODcuN3YtMy42YzAtMzcuNiw1NC44LTY4LjYsOTIuNy02OC42SDMzMmMzNy45LDAsOTIuNywzMC43LDkyLjcsNjguNlYxNDEuN3oiLz4KPC9zdmc%2BCg%3D%3D&colorA=16161d&style=flat-square)

# Radial Representation

![example display](https://github.com/sophielem/radialCrispr/blob/master/docs/example_display.png)

## Usage
Pour utiliser ce composant, il est nécessaire de lui transmettre deux informations à l'aide des propriétés : **dic_sgrna** et **max_occ**.

#### dic_sgrna
Transmettre une chaîne de caractère en format *JSON* sous ce format :
```JSON
{
      "sequence": "GACGCACCAGATTTAGGTTCTGG",
      "occurences": [
          {
              "org": "Buchnera aphidicola (Cinara tujafilina) GCF_000217635.1",
              "all_ref": [
                  {
                      "ref": "NC_015662.1",
                      "coords": [
                          "+(320512,320534)"
                      ]
                  }
              ]
          },
          {
              "org": "Aliivibrio wodanis GCF_000953695.1",
              "all_ref": [
                  {
                      "ref": "NZ_LN554846.1",
                      "coords": [
                          "+(864792,864814)",
                          "+(865131,865153)",
                          "+(865471,865493)",
                          "+(865810,865832)"
                      ]
                  },
                  {
                      "ref": "test.1",
                      "coords": [
                          "+(864792,864814)",
                          "+(865131,865153)",
                          "+(865471,865493)",
                          "+(865810,865832)"
                      ]
                  }
              ]
          }
      ]
  }
```

#### max_occ
Transmettre le nombre d'occurence maximum pour la représentation graphique.

## Event
Un message est transmis lorsque l'utilisateur clique sur un noeud sur le *radar chart* sous le nom : **changeOrgRefSgrna**
npm package: @mmsoft.npm/mylib1
Description: This project was bootstrapped with [TSDX](https://github.com/jaredpalmer/tsdx) and uses [browserify](http://browserify.org/) for boundling HTTP content. By default the following extra npm modules are also installed:
Author: MarekM
Latest version: 0.0.6

# Sample TypeScript based npm module

This project was bootstrapped with [TSDX](https://github.com/jaredpalmer/tsdx) and uses [browserify](http://browserify.org/) for boundling HTTP content.
By default the following extra npm modules are also installed:

- Ionic Capacitor module
    - [@apacitor/core](https://capacitor.ionicframework.com/docs/getting-started/)
- Dependency Injection support
    - [tsyringe](https://github.com/microsoft/tsyringe)
    - [reflect-metadata](https://www.npmjs.com/package/reflect-metadata)
- Utility modules
    - [tiny-invariant](https://github.com/alexreardon/tiny-invariant)
    - [tiny-warning](https://github.com/alexreardon/tiny-warning)

## Local Development

Below is a list of commands you will probably find useful.

### `npm start` or `yarn start`

Runs the project in development/watch mode. Your project will be rebuilt upon changes.
TSDX has a special logger for you convenience. Error messages are pretty printed and formatted for compatibility VS Code's Problems tab.

Your library will be rebuilt if you make edits. Results are stored to 'dist' and 'www' folder.

### `npm run serve` or `yarn serve`

Start simple HTTP server on port 3333. Server root is in 'www' directory.
You can open browser and connect to http://localhost:3333

Note: Use 'chrome' script to start Chrome browser in debug mode.
For debugging you can use VSC Chrome debugger in run or attach mode.

### `npm run chrome` or `yarn chrome`

Start Google Chrome in debug mode waiting for connection on port 9222.

Note: First use 'serve' script to open HTTP server.

### `npm run build` or `yarn build`

Bundles the package to the 'dist' folder.
The package is optimized and bundled with Rollup into multiple formats (CommonJS, UMD, and ES Module).

### `npm test` or `yarn test`

Runs the test watcher (Jest) in an interactive mode.
By default, runs tests related to files changed since the last commit.
npm package: @mmstack/form-core
Description: [![npm version](https://badge.fury.io/js/%40mmstack%2Fform-core.svg)](https://www.npmjs.com/package/@mmstack/form-core) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/mihajm/mmstack/blob/master/packages/form/core/LICENS
Latest version: 21.0.1
npm package: @mmstack/resource
Description: [![npm version](https://badge.fury.io/js/%40mmstack%2Fresource.svg)](https://www.npmjs.com/package/@mmstack/resource) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/mihajm/mmstack/blob/master/packages/resource/LICENSE)
Latest version: 21.1.1
npm package: @mmstudio/am000011
Description: 渲染
Author: taoqf
Latest version: 1.1.202004170858

# 渲染

设置数据，页面刷新渲染。首先开发者需要熟悉react的`jsx`语法.

需要注意的是，这是一个异步的操作。

## 示例

```tsx
import am1 from '@mmstudio/am000001';
import React from 'react';
import { Text, View } from 'react-native';

export default function tpl(a: <T>(action: string, ...args: unknown[]) => ((...args: unknown[]) => void), s: (...class_names: string[]) => {}, d: <T>(d: string) => T, mm: am1) {
	return (<View>
		<Text style={s('txt')} onPress={a<void>('a001')}>
			{d('txt')}{'\n'}{'\n'}
		</Text>
	</View>);
}
```

如果我们在响应`a001.ts`中进行渲染，重新设置`txt`的值，那么界面上显示的文字就会改变。

```ts
// 渲染
await(() => {
	const p1 = {
		txt: 'hello mmstudio'
	};	// 渲染的数据
	return am11(mm, p1);
})();
```
npm package: @mmstudio/an000014
Description: sql查询
Author: taoqf
Latest version: 1.1.0

# sql查询

数据库查询

## 数据库类型

支持mysql,postgres,mariadb

ts返回类型最大20个,如果超过20个，可直接`as`

## 注意事项

### 需要先确定数据库类型

在进行业务开发时，需要首先确定数据库类型，否则sql有非常大的可能性是无法兼容的。

### long类型

postgres数据库中的长整型转换到js中，类型为`BigInt`,比较小的数值最好设置其类型为`smallint`即可。

`BigInt`与`number`类型计算时，需要将`number`转换为`BigInt`后进行。几种转换方法：

1. `BigInt`to`number`.一般无须进行这种转换，因为有可能会因长度不够而失败

	```ts
	function b2n(v: BigInt){
		return parseInt(v.toString(), 10);
	}
	```

1. `number`to`BigInt`

	```ts
	function n2b(v: number){
		return BigInt(v);
	}
	```

1. `string`to`BigInt`

	```ts
	function n2b(v: string){
		return BigInt(v);
	}
	```

1. `BigInt`to`string`

	```ts
	function n2b(v: BigInt){
		return v.toString();
	}
	```

## 配置

mm.json

```json
{
	"dbs": {
		"db001": {
			"type": "postgres",
			"source": "postgres://mmstudio:Mmstudio123@127.0.0.1:5432/mmstudio"
		},
		"db002": {
			"type": "mariadb",
			"source": "mysql://mmstudio:Mmstudio123@127.0.0.1:3306/mmstudio?connectionLimit=5"
		},
		"db003": {
			"type": "mariadb",
			"source": [
				"mysql://mmstudio:Mmstudio123@127.0.0.1:3306/mmstudio?connectionLimit=5",
				"mysql://mmstudio:Mmstudio123@127.0.0.1:3307/mmstudio?connectionLimit=5",
				"mysql://mmstudio:Mmstudio123@127.0.0.1:3308/mmstudio?connectionLimit=5"
			]
		}
	}
}
```

### 说明

1. 项目下的配置会在部署时被覆盖
1. 配置文件名固定mm.json，且须放置在项目根目录
1. dbs下的名称`db001`,`db002`,`db003`视具体情况配置，个数不定，简单项目使用一个数据库亦可。
1. `type`目前只支持`postgres`和`mariadb`两种，`mariadb`与mysql通用
1. `mariadb`支持主从节点配置如`db003`,配置项的第一个将作为主节点

## docker-compose

[docker-compose安装](https://download.daocloud.io/Docker_Mirror/Docker_Compose)

```sh
[sudo] docker-compose -f db.yaml up
```

db.yaml

```yaml
version: '3.7'

services:
  postgres:
    image: postgres
    container_name: postgres
    volumes:
      - /home/taoqf/data/postgre:/var/lib/postgresql/data
    restart: always
    environment:
      POSTGRES_DB: mmstudio
      POSTGRES_USER: mmstudio
      POSTGRES_PASSWORD: Mmstudio123
    ports:
      - 5432:5432

  mariadb:
    image: mariadb
    container_name: mariadb
    restart: always
    volumes:
      - /home/taoqf/data/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: mmstudio
      MYSQL_USER: mmstudio
      MYSQL_PASSWORD: Mmstudio123
      MYSQL_ROOT_PASSWORD: Mmstudio123
    ports:
      - 3306:3306

  adminer:
    container_name: adminer
    image: adminer
    restart: always
    ports:
      - 8080:8080
# networks:
#   default:
```
npm package: @mmstudio/an000015
Description: 编码服务
Author: taoqf
Latest version: 1.0.202004170800

# 编码服务

调用编码服务

## 启动编码服务

需要启动一个单例的[编码服务](https://www.npmjs.com/package/@mmstudio/doccode)

## 配置文件

根据启动的编码服务配置编码服务的地址

mm.json

```json
{
	"doccode": "http://127.0.0.1:8890"
}
```
npm package: @mmstudio/an000022
Description: 获取token
Author: taoqf
Latest version: 1.0.202004170809

# 获取微信token

获取公众号,小程序的accesstoken

## 配置

* 需在项目下的mm.json文件中配置`wx.appid`，`wx.appsecret`。
* wx.appid：小程序唯一凭证，即 AppID，可在「[微信公众平台](https://mp.weixin.qq.com) - 设置 - 开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）。
* wx.appsecret：小程序唯一凭证密钥，即 AppSecret，获取方式同 appid。

```json
{
	"wx": {
		"appid": "xxx",
		"appsecret": "xxx"
	}
}
```
npm package: @mmstudio/an000025
Description: 微信-是否为违法图片
Author: taoqf
Latest version: 1.0.202004170813

# 微信-是否为违法图片

## 参数

名称|说明
---|---
file|要检测的图片文件地址，格式支持PNG、JPEG、JPG、GIF，图片尺寸不超过 750px x 1334px

## 配置

* 需在项目下的mm.json文件中配置`wx.appid`，`wx.appsecret`。
* wx.appid：小程序唯一凭证，即 AppID。
* wx.appsecret：小程序唯一凭证密钥，即 AppSecret。

```json
{
	"wx": {
		"appid": "xxx",
		"appsecret": "xxx"
	}
}
```
npm package: @mmstudio/an000026
Description: 微信-是否为违法文字
Author: taoqf
Latest version: 1.0.202004170815

# 微信-是否为违法文字

## 参数

名称|说明
---|---
text|要检测的文本内容

## 配置

* 需在项目下的mm.json文件中配置`wx.appid`，`wx.appsecret`。
* wx.appid：小程序唯一凭证，即 AppID。
* wx.appsecret：小程序唯一凭证密钥，即 AppSecret。

```json
{
	"wx": {
		"appid": "xxx",
		"appsecret": "xxx"
	}
}
```
npm package: @mmstudio/an000027
Description: 微信-公众号用户基本信息
Author: taoqf
Latest version: 1.0.202004170816

# 微信-公众号用户基本信息

## 配置

* 需在项目下的mm`.json文件中配置`wx.appid`，`wx.appsecret`。
* wx.appid：小程序唯一凭证，即 AppID。
* wx.appsecret：小程序唯一凭证密钥，即 AppSecret。

```json
{
	"wx": {
		"getopenid": true,
		"getuserinfo": false,
		"appid": "xxx",
		"appsecret": "xxx"
	}
}
```

注意:如果配置`getuserinfo`为`true`,则在服务中直接可以通过消息体中的`wxuserinfo`拿到微信用户的个人信息,这种方式只适用于一些公众号不需要用户关注仍然可以获取用户信息的情况,在这种情况下用户查看页面的时候会弹出一个获取用户信息的提示,用户同意后才能继续操作,相对来说,用户体验差.多数情况下,请确保配置`"getuserinfo": false`.这样用户在无感知的情况下就可以查看该公众号的所有信息.但是这种情况需要**用户关注该公众号**,否则使用该原子操作将无法获取到用户的个人信息.

参数

参数openid值在服务中可以从服务参数中`message.wxuserinfo.openid`直接拿到(如为get请求则为`message.query.wxuserinfo.openid`),无须特别处理.

## 小程序用户信息获取

当前原子操作为公众号用户信息的获取,如果是小程序项目,请使用[获取用户的基本信息](https://npmjs.com/package/@mmstudio/an000028)
npm package: @mmstudio/an000028
Description: 微信-小程序用户基本信息
Author: taoqf
Latest version: 1.0.202004170819

# 微信-小程序用户基本信息

## 配置

* 需在项目下的mm.json文件中配置`wx.appid`，`wx.appsecret`。
* wx.appid：小程序唯一凭证，即 AppID。
* wx.appsecret：小程序唯一凭证密钥，即 AppSecret。

```json
{
	"wx": {
		"getopenid": false,			// 必须为false或不配置
		"getuserinfo": false,		// 必须为false或不配置
		"appid": "xxx",
		"appsecret": "xxx"
	}
}
```

参数

参数code通过原子操作[获取用户code](https://npmjs.com/package/@mmstudio/awx000001)获取.

## 公众号用户信息获取

当前原子操作适用于微信小程序的用户信息获取,如果在公众号上获取用户信息,请使用[公众号用户信息获取](https://npmjs.com/package/@mmstudio/an000027)
npm package: @mmstudio/an000029
Description: 用户名密码登录
Author: taoqf
Latest version: 2.0.0

# 用户名密码登录

## postgres

用户数据存储到postgres数据库中，其json字段更便于存储可扩展的用户信息

## 用户表

### 表结构

#### 用户基础信息表

字段名|字段类型|字段描述
---|---|---
id|text|用户id
info|json|用户信息

#### 用户授权信息表

字段名|字段类型|字段描述
---|---|---
id|text|授权信息关键字
user_id|text|用户id
identity_type|text|登录类型（手机号 邮箱 用户名）或第三方应用名称（微信 微博等）
identifier|text|标识（手机号 邮箱 用户名或第三方应用的唯一标识）
credential|text|密码凭证（站内的保存密码，站外的不保存或保存token）

### 建表语句

```sql
DROP TABLE IF EXISTS mm_users;
CREATE TABLE mm_users (
	id text NOT NULL,
	info json,
	PRIMARY KEY (id)
) WITH (oids = false);

DROP INDEX IF EXISTS mm_users_id;
CREATE UNIQUE INDEX mm_users_id ON mm_users(id);

COMMENT ON TABLE mm_users IS '用户基础信息';
COMMENT ON COLUMN mm_users.id IS '用户id';
COMMENT ON COLUMN mm_users.info IS '用户信息';

DROP TABLE IF EXISTS mm_user_auths;
CREATE TABLE mm_user_auths (
	id text NOT NULL,
	user_id text,
	identity_type text,
	identifier text,
	credential text,
	last_active bigint,
	ip text,
	CONSTRAINT pk_mm_user_auths PRIMARY KEY (identifier, identity_type)
) WITH (oids = false);

DROP INDEX IF EXISTS mm_user_auths_id;
CREATE UNIQUE INDEX mm_user_auths_id ON mm_user_auths(id);
DROP INDEX IF EXISTS mm_user_auths_user_id;
CREATE INDEX mm_user_auths_user_id ON mm_user_auths(user_id);
DROP INDEX IF EXISTS mm_user_auths_identity_type;
CREATE INDEX mm_user_auths_identity_type ON mm_user_auths(identity_type);
DROP INDEX IF EXISTS mm_user_auths_identifier;
CREATE INDEX mm_user_auths_identifier ON mm_user_auths(identifier);

COMMENT ON TABLE mm_user_auths IS '用户授权信息';
COMMENT ON COLUMN mm_user_auths.user_id IS 'users.id';
COMMENT ON COLUMN mm_user_auths.identity_type IS '登录类型（手机号 邮箱 用户名）或第三方应用名称（微信 微博等）';
COMMENT ON COLUMN mm_user_auths.identifier IS '标识（手机号 邮箱 用户名或第三方应用的唯一标识）';
COMMENT ON COLUMN mm_user_auths.credential IS '密码凭证（站内的保存密码，站外的不保存或保存token）';
```

## 完整的配置文件

```json
{
	"session": {
		"secret": "Mmstudio123",
		"expiresIn": "30d"
	},
	"db": {
		"type": "postgres",
		"source": "postgres://mmstudio:Mmstudio123@127.0.0.1:5432/mmstudio"
	}
}
```

## docker-file

[docker-compose安置](https://download.daocloud.io/Docker_Mirror/Docker_Compose)

```yml
version: '3.7'

services:
  postgres:
    image: postgres
    container_name: postgres
    volumes:
      - /home/taoqf/data/postgre:/var/lib/postgresql/data
    restart: always
    environment:
      POSTGRES_DB: mmstudio
      POSTGRES_USER: mmstudio
      POSTGRES_PASSWORD: Mmstudio123
    ports:
      - 5432:5432
  adminer:
    container_name: adminer
    image: adminer
    restart: always
    ports:
      - 8080:8080
```
npm package: @mmstudio/an000030
Description: 用户注册
Author: taoqf
Latest version: 2.0.0

# 用户注册

使用用户名/密码注册用户。

## 注意

```json
{
	"db": {
		"type": "postgres",
		"source": "postgres://mmstudio:Mmstudio123@127.0.0.1:5432/mmstudio"
	}
}
```

## 表结构

表结构和数据库启动脚本见[用户名密码登陆](https://npmjs.com/package/@mmstudio/an000029)
npm package: @mmstudio/an000031
Description: 用户名+设备ID登录
Author: taoqf
Latest version: 1.0.202004171633

# 用户名+设备ID登录

## token

可以是移动应用中的设备id，公众号/小程序的openid，web/h5项目可为uuid

## 数据库

表结构和数据库启动脚本见[用户名密码登陆](https://npmjs.com/package/@mmstudio/an000029)
npm package: @mmstudio/an000032
Description: 使用票根登录
Author: taoqf
Latest version: 1.0.202004171634

# 使用票根登录

## token

token为原子操作[用户名+设备ID登录](https://npmjs.com/package/@mmstudio/an000031)使用的值

## 数据库

表结构和数据库启动脚本见[用户名密码登陆](https://npmjs.com/package/@mmstudio/an000029)
npm package: @mmstudio/an000033
Description: 退出登录
Author: taoqf
Latest version: 1.0.202004170840

# 退出登录

清除redis中的用户信息

## 配置文件

需要配置redis到mm.json中

```json
{
	"redis": {
		"url": "redis://127.0.0.1:6379",
		"expiration": 20000
	}
}
```
npm package: @mmstudio/an000034
Description: 获取用户角色菜单
Author: taoqf
Latest version: 1.0.202004171635

# 获取用户角色菜单

## redis

考虑到可多实例部署情况，需要用到redis数据库用来存储用户session

## postgres

用户数据存储到postgres数据库中，其json字段更便于存储可扩展的用户信息

## 用户表

### 表结构

#### 角色表

字段名|字段类型|字段描述
---|---|---
id|text|角色ID
name|text|角色名称

#### 菜单表

字段名|字段类型|字段描述
---|---|---
id|text|菜单ID
name|text|菜单名称
parent|text|父级菜单ID
priority|smallint|显示优先级
url|text|页面地址
authcode|smallint|用户控制码，每一位表示页面上一个功能（通常为按钮）是否可用，比如0b01表示第一个功能可用,0b11表示第一和第二个功能可用，而0b10表示第二个功能可用，第一个功能不可用

#### 角色菜单关联表

字段名|字段类型|字段描述
---|---|---
roleid|text|角色ID role.id
menuid|text|菜单ID menu.id

#### 用户角色关联表

字段名|字段类型|字段描述
---|---|---
userid|text|用户ID user.id
roleid|text|角色ID role.id

### 建表语句

```sql
DROP TABLE IF EXISTS role;
CREATE TABLE role
(
	id text NOT NULL,
	name text NOT NULL,
	PRIMARY KEY (id)
)
WITH (oids = false);

COMMENT ON TABLE role IS '角色表';
COMMENT ON COLUMN role.name IS '角色名称';

DROP TABLE IF EXISTS menu;
CREATE TABLE menu
(
	id text NOT NULL,
	name text NOT NULL,
	parent text,
	priority smallint,
	url text,
	authcode smallint,
	PRIMARY KEY (id)
)
WITH (oids = false);

COMMENT ON TABLE menu IS '菜单表';
COMMENT ON COLUMN menu.id IS '菜单ID';
COMMENT ON COLUMN menu.name IS '菜单名称';
COMMENT ON COLUMN menu.parent IS '父级菜单ID';
COMMENT ON COLUMN menu.priority IS '显示优先级';
COMMENT ON COLUMN menu.url IS '页面地址';
COMMENT ON COLUMN menu.authcode IS '用户控制码，每一位表示页面上一个功能（通常为按钮）是否可用，比如0b01表示第一个功能可用,0b11表示第一和第二个功能可用，而0b10表示第二个功能可用，第一个功能不可用';

DROP TABLE IF EXISTS rolemenu;
CREATE TABLE rolemenu
(
	roleid text NOT NULL,
	menuid text NOT NULL,
	CONSTRAINT pk_rolemenu PRIMARY KEY (roleid, menuid)
)
WITH (oids = false);

COMMENT ON TABLE rolemenu IS '角色菜单关联表';
COMMENT ON COLUMN rolemenu.roleid IS '角色ID role.id';
COMMENT ON COLUMN rolemenu.menuid IS '菜单ID menu.id';

DROP TABLE IF EXISTS userole;
CREATE TABLE userole
(
	userid text NOT NULL,
	roleid text NOT NULL,
	CONSTRAINT pk_userole PRIMARY KEY (userid, roleid)
)
WITH (oids = false);

COMMENT ON TABLE userole IS '用户角色关联表';
COMMENT ON COLUMN userole.userid IS '用户ID user.id';
COMMENT ON COLUMN userole.roleid IS '角色ID role.id';
```

## 完整的配置文件

```json
{
	"redis": {
		"url": "redis://127.0.0.1:6379",
		"expiration": 20000
	},
	"dbs": {
		"sys": {
			"type": "postgres",
			"source": "postgres://mmstudio:Mmstudio123@127.0.0.1:5432/mmstudio"
		}
	}
}
```

## docker-file

[docker-compose安置](https://download.daocloud.io/Docker_Mirror/Docker_Compose)

```yml
version: '3.7'

services:
  redis:
    image: redis
    container_name: redis
    ports:
      - 6379:6379
    # networks:
    #   - app

  postgres:
    image: postgres
    container_name: postgres
    volumes:
      - /home/taoqf/data/postgre:/var/lib/postgresql/data
    restart: always
    environment:
      POSTGRES_DB: mmstudio
      POSTGRES_USER: mmstudio
      POSTGRES_PASSWORD: Mmstudio123
    ports:
      - 5432:5432
  adminer:
    container_name: adminer
    image: adminer
    restart: always
    ports:
      - 8080:8080
```
npm package: @mmstudio/an000035
Description: 获取mm.json配置
Author: taoqf
Latest version: 1.0.202004171413

# 获取mm.json配置

获取配置文件中的配置值

在开发阶段，该原子操作获取的是当前工程下的mm.json的配置，部署后，则获取部署工程下mm.json文件中的配置，如果部署时未配置，则获取工程下mm.json中的配置。
npm package: @mmstudio/an000036
Description: Postgre数据库操作
Author: taoqf
Latest version: 2.1.0

# Postgre数据库操作

## 注意

需要在配置文件

```json
{
	"db": "postgres://mmstudio:Mmstudio123@127.0.0.1:5432/mmstudio"
}
```
npm package: @mmstudio/an000037
Description: MariaDB/MySql数据库操作
Author: taoqf
Latest version: 2.1.0

# MariaDB/MySql数据库操作

## 注意

需要在配置文件mm.json中配置

```json
{
	"db":  "mysql://mmstudio:Mmstudio123@127.0.0.1:3306/mmstudio?connectionLimit=5"
}
```

或

```json
{
	"db":  [
		"mysql://mmstudio:Mmstudio123@master.mydb.com:3306/mmstudio?connectionLimit=5",
		"mysql://mmstudio:Mmstudio123@slave1.mydb.com:3306/mmstudio?connectionLimit=5",
		"mysql://mmstudio:Mmstudio123@slave2.mydb.com:3306/mmstudio?connectionLimit=5",
		"mysql://mmstudio:Mmstudio123@slave3.mydb.com:3306/mmstudio?connectionLimit=5",
		"mysql://mmstudio:Mmstudio123@slave4.mydb.com:3306/mmstudio?connectionLimit=5",
		"mysql://mmstudio:Mmstudio123@slave5.mydb.com:3306/mmstudio?connectionLimit=5"
	]
}
```
npm package: @mmstudio/an000038
Description: bigint类型转为number
Author: taoqf
Latest version: 1.0.1

# bigint类型转为number

## 注意

不可滥用！！！
不可滥用！！！
不可滥用！！！

这种转换是有风险的，因为在转换过程中可能会损失精度，但时间戮类型字段是没有影响的。

其它类型的数据转换时一定要确保数据完整性。
npm package: @mmstudio/an000041
Description: 解析http请求上传的文件
Author: taoqf
Latest version: 3.0.0

# 解析http请求上传的文件

在http服务器上接收请求时，有时候我们需要解析客户端上传的文件。

## 配置文件

由于我们需要设置客户端的上传文件的大小，默认是2m（`2 * 1024 * 1024`）。注意，配置文件是必要的，配置项不是必要的，但我们强烈建议不要使用默认值。

```conf
MAX_FILE_SIZE=2097152
```
npm package: @mmstudio/an000042
Description: 配置anylogger-log4js
Author: taoqf
Latest version: 1.0.0

# 配置anylogger-log4js

配置anylogger

配置文件 `log4js.json`

```json
{
	"appenders": {
		"console": {
			"type": "console"
		},
		"DAILYFILE": {
			"type": "dateFile",
			"filename": "./logs/mm.log",
			"pattern": ".yyyy-MM-dd-hh",
			"alwaysIncludePattern": false,
			"daysToKeep": 13,
			"maxLogSize": 20971520,
			"keepFileExt": true
		}
	},
	"categories": {
		"default": {
			"appenders": [
				"DAILYFILE",
				"console"
			],
			"level": "DEBUG"
		}
	}
}
```
npm package: @mmstudio/an000043
Description: 保存文件到数据库
Author: taoqf
Latest version: 3.0.5

# 保存文件到数据库

将解析好的文件保存进数据库，对象数据库采用minio

## 安装

```sh
yarn add @mmstudio/an000043
```

## 配置文件

.env or .env.local

```conf
MINIO_NAME_SPACE=mmstudio
MINIO_CONFIG = {"endPoint":"127.0.0.1","port":9000,"accessKey":"mmstudio","secretKey":"Mmstudio123","useSSL":false,"region":"cn-north-1","partSize":5242880}
```
npm package: @mmstudio/an000044
Description: 保存视频文件到文件服务
Author: taoqf
Latest version: 1.4.0

# 保存视频文件到文件服务

将视频文件保存进数据库，对象数据库采用minio

## 注意事项

1. 上传视频过程会对视频文件进行采样截图，将截图信息作为文件的返回信息并返回给调用者(`key='file.meta.screenshot'`)，该信息为截图文件的id。
1. 如果视频文件编码不是h264，则将其转换为h264文件
1. 有些视频文件如部分(flv)不是mp4格式，但其编码方式为h264,同样可以在浏览器中播放
1. 视频文件的转换比较耗时，鼓励用户直接上传mp4格式文件，不建议在服务器上进行大量转换操作，因其消耗大量cpu资源，将会严重拖慢服务器运行效率。
1. 同样因为转换比较耗时，非mp4格式的文件（确切地讲，视频编码格式非h264的文件）在处理时不作等待即返回给客户端，但该文件仅当转换结束后方可访问。之前不能被访问到，并非上传失败，需谨记此，诱导用户操作时需说明，不要让用户作大量重复上传，同样会拖慢服务器运行效率。

## 返回格式

```ts
{
	id: string;
	contentType: string;
	meta: {
		screenshot: string;
		video:{}
		audio:{}
	},
	md5: string;
	name: string;
}
```

## 配置文件

mm.json

```json
{
	"minio": {
		"endPoint": "127.0.0.1",
		"port": 9000,
		"accessKey": "mmstudio",
		"secretKey": "Mmstudio123",
		"useSSL": false,
		"region": "cn-north-1",
		"partSize": 5242880
	}
}
```

## docker

```yml
version: '3.7'

services:
  minio:
    image: minio/minio
    container_name: minio
    command: server /data
    volumes:
      - /home/taoqf/data/minio:/data
    ports:
      - 9000:9000
    environment:
      MINIO_ACCESS_KEY: mmstudio
      MINIO_SECRET_KEY: Mmstudio123

```
npm package: @mmstudio/an000045
Description: 解析http并保存文件
Author: taoqf
Latest version: 2.1.3

# 解析http并保存文件

在服务中保存文件到数据库

## 配置文件

.env or .env.local

```conf
MINIO_NAME_SPACE=mmstudio
MINIO_CONFIG = {"endPoint":"127.0.0.1","port":9000,"accessKey":"mmstudio","secretKey":"Mmstudio123","useSSL":false,"region":"cn-north-1","partSize":5242880}
```
npm package: @mmstudio/an000046
Description: 读取(下载)文件
Author: taoqf
Latest version: 3.0.8

# 读取(下载)文件

支持断点续传

## 配置文件

.env or .env.local

```conf
MINIO_NAME_SPACE=mmstudio
MINIO_CONFIG = {"endPoint":"127.0.0.1","port":9000,"accessKey":"mmstudio","secretKey":"Mmstudio123","useSSL":false,"region":"cn-north-1","partSize":5242880}
```
npm package: @mmstudio/an000048
Description: 处理跨域
Author: taoqf
Latest version: 2.0.0

# 处理跨域

在开发的时候，经常需要在h5端调试页面，该原子操作在开发时添加cros处理，部署后不起使用。

如果用于真实h5项目，则**请不要使用**该原子操作。
npm package: @mmstudio/an000049
Description: 数据库操作
Author: taoqf
Latest version: 4.0.0

# 数据库操作

操作数据库，支持多种数据库

## postgresql

```sh
yarn add pg
```

```json
{
	"dbconfig":{
		"client": "mysql",
		"connection": {
			"host": "127.0.0.1",
			"user": "your_database_user",
			"password": "your_database_password",
			"database": "myapp_test"
		}
	}
}
```

```json
{
	"dbconfig":{
		"client": "pg",
		"connection": "pgconnectstring",
		"searchPath": [
			"knex",
			"public"
		]
	}
}
```

```json
{
	"dbconfig":{
		"client": "pg",
		"version": "7.2",
		"connection": {
			"host": "127.0.0.1",
			"user": "your_database_user",
			"password": "your_database_password",
			"database": "myapp_test"
		}
	}
}
```

## mysql/mariadb

```sh
yarn add mysql2
```

or

```sh
yarn add mysql
```

mm.json

```json
{
	"dbconfig":{
		"client": "mysql",
		"version": "5.7",
		"connection": {
			"host": "127.0.0.1",
			"user": "your_database_user",
			"password": "your_database_password",
			"database": "myapp_test"
		}
	}
}
```

```json
{
	"dbconfig":{
		"client": "mysql",
		"connection": {
			"host": "127.0.0.1",
			"user": "your_database_user",
			"password": "your_database_password",
			"database": "myapp_test"
		},
		"userParams": {
			"userParam1": "451"
		}
	}
}
```

```json
{
	"dbconfig":{
		"client": "mysql",
		"connection": {
			"host": "127.0.0.1",
			"user": "your_database_user",
			"password": "your_database_password",
			"database": "myapp_test"
		},
		"pool": {
			"min": 0,
			"max": 7
		}
	}
}
```

## oracle

```sh
yarn add oracledb
```

```json
{
	"dbconfig":{
		"client": "oracledb",
		"connection": {},
		"fetchAsString": [
			"number",
			"clob"
		]
	}
}
```

## sqlite

```sh
yarn add sqlite3
```

```json
{
	"dbconfig":{
		"client": "sqlite3",
		"connection": {
			"filename": "./mydb.sqlite"
		}
	}
}
```

## mssqlserver

```sh
yarn add mssql
```

```json
{
	"dbconfig":{
		"client": "mssql",
		"connection": {
		}
	}
}
```
npm package: @mmstudio/an000053
Description: 删除文件
Author: taoqf
Latest version: 2.0.1

# 删除文件

## 安装

```sh
yarn add @mmstudio/an000053
```

## 配置文件

.env or .env.local

```conf
MINIO_NAME_SPACE=mmstudio
MINIO_CONFIG = {"endPoint":"127.0.0.1","port":9000,"accessKey":"mmstudio","secretKey":"Mmstudio123","useSSL":false,"region":"cn-north-1","partSize":5242880}
```
npm package: @mmstudio/an000054
Description: 替换文件
Author: taoqf
Latest version: 1.1.0

# 替换文件

## 安装

```sh
yarn add @mmstudio/an000054 @mmstudio/config anylogger
```

## 配置文件

mm.json

```json
{
	"minio": {
		"endPoint": "127.0.0.1",
		"port": 9000,
		"accessKey": "mmstudio",
		"secretKey": "Mmstudio123",
		"useSSL": false,
		"region": "cn-north-1",
		"partSize": 5242880
	}
}
```

## docker

```yml
version: '3.7'

services:
  minio:
    image: minio/minio
    container_name: minio
    command: server /data
    volumes:
      - /home/data/minio:/data
    ports:
      - 9000:9000
    environment:
      MINIO_ACCESS_KEY: mmstudio
      MINIO_SECRET_KEY: Mmstudio123
```
npm package: @mmstudio/aw000006
Description: form表单提交
Author: taoqf
Latest version: 1.0.202004171547

# form表单提交

表单直接调用某个服务，页面不跳转。

支持form表单提交，包括文件上传

支持表单验证，如`require`等。

如果不是表单元素，可以先获取其值，然后将其值作为额外参数一起提交。

```html
<form data-mm-id="fm001">
	...
</form>
```
npm package: @mmstudio/aw000018
Description: 调用其它组件
Author: taoqf
Latest version: 1.0.202004161800

# 调用其它组件

组件A(如zj-001)调用组件B(如zj-002)，组件B进行操作之后返回结果给A。

## 注意

从设计上来讲，组件间的调用不应过多，如果组件间调用过多，请检查是否组件的划分不合理。

## 参数和返回值

在A向B调用时，往往会向B发送一个到多个实参，B拿到实参后进行逻辑处理，并可能会返回一个结果R给A。

如在A中

zj-001/a001.ts

```ts
// 调用其它组件
/**
 * 组件B返回的结果
 */
const r$CURRENT_SECONDS_UNIX = await(() => {
	const p1 = 'zj-002';	// 被调用的组件编号,如'zj-001','zj-002'
	const p2 = 'a001';	// 被调用组件的响应名，如'a001','a002
	const e1 = 'mm';
	const e2 = 'studio';
	return aw18(p1, p2, e1, e2); // 这里e1,e2,...为不固定个数参数，根据实际情况修改。在被调用组件的响应文件中，可以使用多个形（从第二个参数开始）参直接接收这些参数
})();
// r$CURRENT_SECONDS_UNIX === 'mmstudio';
```

在组件B中进行逻辑处理

zj-002/a001.ts

```ts
export default async function a001(mm: aw1, e1: string, e2: string) {
	console.log('received arguments:', e1, e2);
	return e2;	// 这里返回结果给组件A
}
```
npm package: @mmstudio/aw000022
Description: 拼接文件id为可访问路径
Author: taoqf
Latest version: 1.0.202004161805

# 拼接文件id为可访问路径

通常，我们只需要在数据库业务表中存储文件id即可。利用该原子操作根据当前环境（开发，部署）拼接文件路径。
npm package: @mmstudio/aw000024
Description: 向原生发送ready事件
Author: taoqf
Latest version: 1.0.202004161817

# 向原生发送ready事件

## 注意

1. 必须在嵌入app的页面使用该原子操作。
1. 在同一个h5页面中，不要使用多次
1. 在同一个h5页面中，不要在多个组件内跟原生应用通信，如果多个组件需要通信，可以使用组件间通信来实现，与原生应用通信的组件应该只有一个。
1. 原生应用调用h5页面的响应必须在h5页面调用ready事件之后。
1. 原生应用h5页面的响应都会到调用ready事件的组件中来。
npm package: @mmstudio/doccode
Description: 编码服务
Author: taoqf
Latest version: 4.0.1

# 编码服务

## Description

生成唯一全局编码。

编码配置均需要有前缀，同时前缀也作为编码的名称，即数据库中`id`字段值。该服务免配置，但也可以在数据库中对配置表进行修改.

## 注意

该服务**不可部署多个实例**

另外，由于该服务生成编号时为了保证生成的编号唯一，需要排队处理大量的并发请求，所以在使用中，请一定避免多次调用。

## 部署

1. 生成配置表，根据实际部署情况修改
1. 安装`yarn add @mmstudio/doccode pg`(`pg` for PostgreSQL, `mysql` for MySQL/MariaDB, `sqlite3` for SQLite3, `oracledb` for Oracle, or `mssql` for MSSQL )
1. 启动`./node_moduels/.bin/mm-doccode`

## Useage

```sh
curl http://127.0.0.1:8890 -d 'name=foo'
# ["foo000001"]
curl http://127.0.0.1:8890 -d 'name=foo&num=1'
# ["foo000002"]
curl http://127.0.0.1:8890 -d 'name=foo&num=3'
# ["foo000003","foo000004","foo000005"]
curl http://127.0.0.1:8890 --header "Content-Type:application/json" -d '{"name":"foo","num":1}'
# ["foo000006"]
curl http://127.0.0.1:8890 -d 'name=20200204&num=10&len=3'
# ["20200204001","20200204002","20200204003","20200204004","20200204005","20200204006","20200204007","20200204008","20200204009","20200204010"]
curl http://127.0.0.1:8890 -d 'name=20200204&num=10&len=2'
# ["2020020401","2020020402","2020020403","2020020404","2020020405","2020020406","2020020407","2020020408","2020020409","2020020410"]
```

经以上调用之后，数据库表如下:

id | len | no
---|---|---
foo | 6 | 2
bar | 6 | 5
20200204 | 3 | 10
20200204 | 2 | 10

## Configuration

### mm.json

postgre

```json
{
	"port": 8890,
	"dbconfig": {
		"client": "pg",
		"connection": "postgres://mmstudio:Mmstudio123@127.0.0.1:5432/mmstudio"
	}
}
```

mysql/mariadb

```json
{
	"port": 8890,
	"dbconfig": {
		"client": "mysql",
		"connection": "mysql://mmstudio:Mmstudio123@127.0.0.1:3306/mmstudio?connectionLimit=5"
	}
}}
```

另外，也支持mssql，oracle，和sqlite。

### log4js.json

```json
{
	"appenders": {
		"out": {
			"type": "stdout"
		},
		"console": {
			"type": "console"
		},
		"dateFile": {
			"type": "dateFile",
			"filename": "./logs/mm.log",
			"maxLogSize": 10240000,
			"backups": 30
		}
	},
	"categories": {
		"default": {
			"appenders": [
				"console",
				"dateFile"
			],
			"level": "debug"
		}
	}
}
```

## Table

字段名称|类型|说明
---|---|---
id|text|关键字，如果配置表有该项，则使用该项配置，如没有，则自动创建，也作为前缀
len|smallint|编码长度，仅包含数字长度，不包含前缀长度，默认为6位
no|bigint|当前编号，自动创建时默认起始编号为1

## docker-compose

[docker-compose安置](https://download.daocloud.io/Docker_Mirror/Docker_Compose)

```sh
[sudo] docker-compose -f db.yaml up
```

db.yaml

```yaml
version: '3.7'

services:
  postgres:
    image: postgres
    container_name: postgres
    volumes:
      - /home/taoqf/data/postgre:/var/lib/postgresql/data
    restart: always
    environment:
      POSTGRES_DB: mmstudio
      POSTGRES_USER: mmstudio
      POSTGRES_PASSWORD: Mmstudio123
    ports:
      - 5432:5432

  adminer:
    container_name: adminer
    image: adminer
    restart: always
    ports:
      - 8080:8080
# networks:
#   default:
```
npm package: @mmstudio/schedule
Description: Node.js schedule service.
Latest version: 7.0.0

# 1. Node.js Service

<!-- TOC -->

- [1. Description](#1-description)
- [2. 服务](#2-服务)
- [3. 注意](#3-注意)
- [4. 开发](#4-开发)
- [5. 编译](#5-编译)
- [6. 运行](#6-运行)
- [7. Config](#7-config)
	- [7.1. mm.json](#71-mmjson)
		- [7.1.1. service](#711-service)
		- [7.1.2. description](#712-description)
		- [7.1.3. rule](#713-rule)
		- [7.1.4. start](#714-start)
		- [7.1.5. end](#715-end)
		- [7.1.6. data](#716-data)
	- [7.2. log4js.json](#72-log4jsjson)

<!-- /TOC -->

## 1. Description

定时任务，适用于例如“每天的0点”或“每年3,6,9月份的第二个周日”执行的任务，如果是每隔一分钟执行一次的任务，则不适用于这类任务.

## 2. 服务

根据配置定时调用某个服务，服务调用与普通的服务区别：

1. 无动态参数，如果需要配置某些固定参数，请在mm.json中的data中配置
1. 无返回值

## 3. 注意

正常情况下，服务不可部署多个实例，但若定时任务的系统资源消耗量过大，可以部署多个，但需要修改定时任务的策略，让多个定时任务的服务的工作合并时达到预期值即可。比如定时任务需要执行a,b,c三个任务，而a任务的工作量过大，可以将a单独配置部署，即配置文件`mm.json`的`jobs`中只包含a的任务，b和c合并部署一台服务器。再比如a的定时任务实在太大，同一台服务器资源受限无法完成，可以将a再次拆解，假如a任务每隔10分钟执行一次，可以分解为两个服务实例，单个服务器的执行任务策略修改为20分钟一次。

在正式环境部署时，最好使用docker进行，且设定其在导致异常时重启容器。

## 4. 开发

`yarn dev-schedule`

## 5. 编译

`yarn build`

## 6. 运行

`yarn build`

## 7. Config

### 7.1. mm.json

``` json
{
	"jobs": [
		{
			"service": "s001",
			"description": "example for schedule",
			"rule": "* * * * * *",
			"start": "",
			"end": "",
			"data": {
				"test": "feidao"
			}
		}
	]
}
```

#### 7.1.1. service

服务文件名，为项目下 src/schedule下相对文件名。

#### 7.1.2. description

定时任务说明

#### 7.1.3. rule

```txt
*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ 一周中的第几天 (0 - 7) (0 或 7 为周日)
│    │    │    │    └───── 月 (1 - 12)
│    │    │    └────────── 一个月的第几天 (1 - 31)
│    │    └─────────────── 小时 (0 - 23)
│    └──────────────────── 分钟 (0 - 59)
└───────────────────────── 秒 (0 - 59, 非必填)
```

说明：

- `*` 表示全部
- `?` 不详，试验结果在第4项（一个月的第几天）和第6项(一周中的第几天)中与`*`等效
- `m-n` 表示从`m`到`n`期间都执行
- `*/n` 表示每隔`n`个时间单位执行一次
- `m,n` 表示`m`和`n`都执行
- `#m` 表示第二个，如`* * * * * 0#m`表示每个月的第二个周日

#### 7.1.4. start

时间戳或时间字符串，如

```ts
1610440541000
"1/12/2021, 4:35:41 PM"
"1/12/2021, 16:35:41"
"1/12/2021"
"Tue Jan 12 2021"
"Tue Jan 12 2021 16:35:41 GMT+0800 (China Standard Time)"
"Tue Jan 12 2021 16:35:41 GMT+0800"
```

#### 7.1.5. end

```ts
1610440541000
"1/12/2021, 4:35:41 PM"
"1/12/2021, 16:35:41"
"1/12/2021"
"Tue Jan 12 2021"
"Tue Jan 12 2021 16:35:41 GMT+0800 (China Standard Time)"
"Tue Jan 12 2021 16:35:41 GMT+0800"
```

#### 7.1.6. data

附加固定参数，比如第三方服务如微信服务的appid之类的。

### 7.2. log4js.json

日志配置，具体请参考官方说明：[log4js](https://github.com/nomiddlename/log4js-node)
npm package: @mmstudio/server
Description: web server
Author: taoqf
Latest version: 1.1.0

# Webserver

This is a web server for local development and deploy.

## 部署

安装

```sh
yarn add @mm-works/p000001
```

启动

```sh
./node_moduels/.bin/mm-server
```

## 配置

配置文件`mm.json`,主要配置端口，数据库服务

```json
{
	"port": 8889,
	"timeout": 500000,
	"acma": 150000,
	"max_file_size": 53687091200,
	"minio": {
		"endPoint": "127.0.0.1",
		"port": 9000,
		"accessKey": "mmstudio",
		"secretKey": "Mmstudio123",
		"useSSL": false,
		"region": "cn-north-1",
		"partSize": 5242880
	},
	"redis": {
		"url": "redis://127.0.0.1:6379",
		"expiration": 20000
	},
	"dbs": {
		"sys": {
			"type": "postgres",
			"source": "postgres://mmstudio:Mmstudio111111@127.0.0.1:5432/feidao"
		},
		"prj001": {
			"type": "mariadb",
			"source": "mysql://mmstudio:Mmstudio111111@127.0.0.1:3306/feidao?connectionLimit=5"
		}
	}
}
```
npm package: @mmstudio/wm000002
Description: 倒计时
Author: taoqf
Latest version: 1.0.202004170939

# 倒计时

## 属性

### until

倒计时的截止时间

### style

组件样式

### size

组件大小

### timeLabelStyle

时间标签样式

### separatorStyle

分隔符样式

### digitStyle

数字样式

### digitTxtStyle

数字文本样式

### timeToShow

显示的格式[‘D’,’H’,’M’,’S’]

### timeLabels

文本要在时间标签中显示(如：{ d: ‘天’;h: ‘时’;m: ‘分’;s: ‘秒’; })

### showSeparator

是否显示分隔符

## 事件

### onFinish

倒计时结束事件

### onChange

时间改变，注:如果界面到后台之后，事件不触发
npm package: @mmstudio/wm000004
Description: 日期选择
Author: taoqf
Latest version: 1.0.202004170941

# 日期选择

## 属性

参见[链接](https://github.com/mmazzarolo/react-native-modal-datetime-picker#available-props)

主要涉及的几个属性

### mode

- `datetime`

	同时选日期和时间,android上分为两步

- `date`

	选择日期

- `time`

	选择时间

### onConfirm

确认事件

### isVisible

是否显示，设置为true时显示，默认不显示
npm package: @mmstudio/ww000004
Description: a标签分页
Author: taoqf
Latest version: 1.0.202004031708

# a标签分页

## Attributes

### `key`

当前页码在url栏中的key值。（常用page-no）【 String 】

> 例：key="page-no" 同时需要添加page-no属性以及对应的值标示页码

```html
<mm-000004 key="page-no" size=3 total=20>
</mm-000004>
```

### `size`

每页显示的数据条数【 Number 】

### `total`

数据总条数【 Number 】

### `max-btn-num`

显示按钮总数 【 Number 】

### `show-first`

是否显示首页按钮 ( true | false )

### `show-last`

是否显示末页按钮 ( true | false )

### `show-goto`

是否显示跳转按钮 ( true | false )

### `show-total`

是否显示总数据条数信息 ( true | false )

### `show-first-last-no`

是否显示首页及末尾页数字按钮 ( true | false )

### `lang`

语言,目前可选值有`zh_CN`和`en_US`,其它值均作英文处理.

## Example

### 不显示按钮

```html
<mm-000004 key="page-no" size=3 total=20>
</mm-000004>
```

### 最多显示两个按钮

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=2>
</mm-000004>
```

### 显示数据总条数

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=2 show-total>
</mm-000004>
```

### 只显示页码

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=4>
</mm-000004>
```

### 显示首页和末页

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=4 show-first show-last>
</mm-000004>
```

### 显示跳转

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=4  show-goto>
</mm-000004>
```

### 显示首页/末页/跳转

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=4  show-first show-last show-goto>
</mm-000004>
```

### 完整功能示例

```html
<mm-000004 key="page-no" size=3 total=20 max-btn-num=4  show-first show-last show-goto show-total>
</mm-000004>
```
npm package: @mmstudio/wwx000001
Description: 滑动列表控件
Author: taoqf
Latest version: 1.0.202004170941

# 滑动列表控件

<!-- TOC -->

- [1. 使用方法](#1-使用方法)
- [2. 属性](#2-属性)
- [3. 方法](#3-方法)
	- [3.1. `open()`](#31-open)
	- [3.2. `close()`](#32-close)
- [4. 事件](#4-事件)
	- [4.1. `mmwe-open`](#41-mmwe-open)
	- [4.2. `mmwe-close`](#42-mmwe-close)

<!-- /TOC -->

小程序自定义组件

> 使用此组件需要依赖小程序基础库 2.2.1 以上版本，同时依赖开发者工具的 npm 构建。具体详情可查阅[官方 npm 文档](https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html)。

[使用示例](https://developers.weixin.qq.com/s/HlZlvOmO7g42)

## 1. 使用方法

1. 在WXML文件中添加控件

    使用vscode插件的方式添加代码,定位到要添加该控件的代码处,按快捷键`alt+t w`添加控件代码片段

1. 注意

	- 每一个 mm-000001 提供两个`<slot>`节点，用于承载组件引用时提供的子节点。

	- left 节点用于承载静止时 mm-000001 所展示的节点，此节点的宽高应与传入 mm-000001 的宽高相同。

	- right 节点用于承载滑动时所展示的节点，其宽度应于传入 mm-000001 的 slideWidth 相同。

	``` xml
	<mm-000001 class="slide" width="320" height="100" slideWidth="200">
	<view slot="left">这里是插入到组内容</view>
	<view slot="right">
		<view>标为已读</view>
		<view>删除</view>
	</view>
	</mm-000001>
	```

## 2. 属性

| 属性名 | 类型 | 默认值 | 是否必须 | 说明
|-------|-----|-------|---------|------|
| width | Number | 显示屏幕的宽度 | 是 | mm-000001组件的宽度 |
| height | Number | 0 | 是 | mm-000001组件的高度 |
| slide-width | Number | 0 | 是 | 滑动展示区域的宽度（默认高度与控件相同）|
| wid | String | 无 | 是 | 控件标示|

## 3. 方法

### 3.1. `open()`

展开菜单

使用示例：

wxml

```xml
<mm-000001 width="750" height="110" slide-width="500" class='class-name' wid='widget-001'>
	<view slot="left" class="l">
		内容
	</view>
	<view slot="right" class="r" style="background:#ccc;width:250rpx;">
		<view>菜单</view>
	</view>
</mm-000001>
```

### 3.2. `close()`

关闭菜单

## 4. 事件

### 4.1. `mmwe-open`

菜单展开事件

可以通过 e.detail.wid获取控件的唯一标示

### 4.2. `mmwe-close`

菜单折叠事件

可以通过 e.detail.wid获取控件的唯一标示
npm package: @mmt-finance/clmm-sdk
Description: Momentum SDK to access the Momentum CLMM
Author: Momentum Finance
Latest version: 1.3.25

# MMT Finance CLMM SDK

`@mmt-finance/clmm-sdk` is the official TypeScript SDK for integrating with
MMT Finance CLMM for developers. Please visit 
[MMT Developer Docs](https://developers.mmt.finance/clmm-sdk/integrations)
for detailed guideline.

## Getting Started

### Installation

```sh
npm i @mmt-finance/clmm-sdk
```

### Configuration

Our SDK has pre-configured network settings that allows you to connect to MMT CLMM
on both mainnet and testnet.
You can utilize the src/sdk NEW method to swiftly initialize the configuration. 

```typescript
import { MmtSDK } from '@mmt-finance/clmm-sdk'

const mmtClmmSDK = MmtSDK.NEW({
  network: 'mainnet',
});
```

Now, you can start using MMT SDK.

### Supported Features

* [Retrieve pool data](https://developers.mmt.finance/features/read-pool-data)
* [Retrieve user data](https://developers.mmt.finance/features/read-user-data)
* [Swap](https://developers.mmt.finance/features/swap)
* [Open and Add Liquidity](https://developers.mmt.finance/features/open-and-add-liquidity)
* [Position Management](https://developers.mmt.finance/features/position-management)
* [Claim Fees and Rewards](https://developers.mmt.finance/features/claim-fees-and-rewards)
* [Close Position](https://developers.mmt.finance/features/close-position)

For a full detailed technical integration doc, please visit 
[MMT Developer Docs](https://developers.mmt.finance/clmm-sdk/integrations).

### Examples
A comprehensive set of examples has been provided to demonstrate the fundamental usage of the SDK. 
Please refer to the detailed guidelines for further information [example](examples/README.md)