2.0.17 • Published 4 years ago

user-picker v2.0.17

Weekly downloads
2
License
MIT
Repository
-
Last release
4 years ago

User Picker 选人组件

User Picker Components for Vue 2.0

Installation

# 正式版:
npm install user-picker  --save

# 测试版
npm install user-picker@2.0.10-beta.0

Usage

Import all components.

1.依赖 View-Design

2.依赖 Element UI 的 tree 组件

import Vue from 'vue';
import ViewUI from 'view-design';
import 'view-design/dist/styles/iview.css';
Vue.use(ViewUI);

import { Tree } from 'element-ui';
Vue.component(Tree.name, Tree);

## 引入 UserPicker
import UserPicker from 'user-picker';
Vue.use(UserPicker);

引入 view-design,参考其官网

【重要】(查看文档 view-design)

引入 element-ui 按需加载配置,参考其官网

【重要】(查看文档 element-ui)

CDN 待实现

html cdn引入方式 TODO

Documentation 选人组件 UserPicker


可配置参数列表 UserPicker

字段说明类型默认值示例
load-data加载tree的方法Function--
search-data搜索加载tree的方法Function--
required是否必填Booleanfalse-
disabled是否可编辑Booleantrue-
preload是否开启预加载Booleanfalse-
auto-params非首次加载tree 自动带上的点击的当前节点的数据Array'Id', 'SelectNodeType'"id","type"
static-params每次加载tree需要带上的静态参数json-{}
search-params每次搜索需要带上的静态参数json-{}
limit限制可选择的个数String不限-
placeholder搜索框的默认文案String'请输入关键字搜索'-
treeRangeTitle选择范围的titleString'选择范围'-
treeRangeList选择范围,树顶部的筛选范围Array[]见下面treeRangeList
treeRangeValue选择范围,默认选中的valueString'''2,4'
upkClassName选人组件弹框的自定义样式类Array[]'custom-upk'
plusClassName加号的自定义样式类Array[]'custom-style'

角色筛选数据格式 treeRangeList

[
    {
        label: '局校',
        value: 1,
        isChecked: false
    },
    {
        label: '教职工',
        value: 2,
        isChecked: true
    },
    {
        label: '学生',
        value: 3,
        isChecked: false
    },
    {
        label: '家长',
        value: 4,
        isChecked: false
    }
]

组件提供方法

方法名说明参数返回值-
userPickerInit初始化选人组件,自定义slot场景下,点击加号时调用,this.$refs.TODORef.userPickerInit();[]--
buildParams搜索时需要调用此方法获取ajax参数,this.$refs.TODORef.buildParams();[]--

组件提供事件

事件名说明参数返回值-
on-user-picker-change选人结果变化事件-arr监听此事件可以实时获取选人结果
on-user-picker-del页面选人框里删除事件-arr-
on-click-okmodal点击确定事件-arr-

接口上传参数

示例

参数说明
Id--
CheckType--
DepartmentType--
ShowUserType--
IsIncludeBranch--
IsIncludeOfficeSchool--
SelectNodeType--
ShowDepartmentByUser--
Key--
IsList--

...

接口最少返回字段(重要)

字段名说明
Name张三显示文本
QId1节点唯一标识QID
Disabledtruetrue表示不可选,false表示可选
Iconios-folder需要显示的icon, 就是iview icon的type
IsLeaftrue是否是叶子节点,true是叶子,false非叶子节点
SearchName张三搜索时返回,前端用于显示的name

说明:以上字段都需要返回 。

返回数据示例

{
    "ErrorCode": "OK",
    "RequestId": "1",
    "Data": {
        "Nodes": [
            {
                "Id": 1117748,
                "OrgId": 100096,
                "Name": "测试教育局",
                "ParentId": 0,
                "Children": [],
                "Path": [],
                "PathString": "",
                "SearchName": "测试<em>教育</em>局",
                "Disabled": true,
                "IsLeaf": false,
                "Icon": "ios-folder",
                "QId": "BASIC_100096_1117748",
                "Parents": [],
                "Extra": "",
                "SelectNodeType": 1
            }
        ]
    }
}

业务项目引用完整示例 --- start ---

  1. 入口文件main.js引入相关库
import Vue from 'vue';
import ViewUI from 'view-design';
import 'view-design/dist/styles/iview.css';
Vue.use(ViewUI);

import { Tree } from 'element-ui';
Vue.component(Tree.name, Tree);

import UserPicker from 'user-picker';
Vue.use(UserPicker);
  1. vue文件引入UserPicker组件
<template>
    <Form
        :label-width="120"
        ref="editAritcleForm"
        :model="articleModel"
        class="pb200 pt10"
        :rules="articleRulesConfig">
    
        <!-- 学校发消息选人  -->
        <FormItem label="发送给" prop="range" required v-if="bgType != 3">
            <UserPicker
                :load-data="loadData"
                :search-data="searchData"
                :static-params="staticParams"
                tree-range-title="通知范围"
                :tree-range-list="treeRangeList"
                :tree-range-value="articleModel.notifyRange"
                placeholder="搜索部门或者人员"
                ref="XXXRef"
                :disabled="status == '1'"
                @on-click-ok="userPickerOk"
                v-model="articleModel.range" />
        </FormItem>
        <!-- 上级单位选人 -->
        <FormItem label="发送给" prop="range" required v-if="bgType == 3" >
            <UserPicker
                :load-data="loadData"
                :search-data="searchData"
                :static-params="staticParams"
                tree-range-title="通知范围"
                :tree-range-list="treeRangeList"
                :tree-range-value="articleModel.notifyRange"
                placeholder="搜索部门或者人员"
                ref="XXXRef"
                :disabled="status == '1'"
                @on-click-ok="userPickerOk"
                v-model="articleModel.range" />
        </FormItem>
        <FormItem label="标题" prop="title">
            <Input v-model="articleModel.title" :disabled="id!='0' && status == '1'"  :maxlength="50" placeholder="请输入标题" />
        </FormItem>
        <FormItem label="正文" prop="content">
            <quill-editor
                class="quill-editor"
                ref="articleQuillEditor"
                v-model.trim="articleModel.content">
            </quill-editor>
        </FormItem>
        <FormItem label="作者" prop="Author" v-if="bgType == 3">
            <Input style="width:300px;" v-model="articleModel.Author" :disabled="id!='0' && status == '1'"  :maxlength="20" placeholder="请输入作者名称" />
        </FormItem>
    </Form>
</template>
<script>
export default {
    mixins: [],
    data() {
        return {
            status: this.$route.params.status || 0,
            // bgType 3 上级单位
            bgType: this.$route.params.bgType || 3,
            id: this.$route.params.id || 0,
            articleModel: {
                name: '',
                range: [],
                title: '',
                content: '',
                Author: '',
                notifyRange: ''
            },
            articleRulesConfig: {
                // 数组需要自定义校验方式
                range: [
                    {
                        validator: (rules, value, callback) => {
                            if (value.length == 0) {
                                return callback(new Error('请选择接收通知的人群'));
                            } else {
                                return callback();
                            }
                        }
                    }
                ],
                title: [
                    {
                        required: true,
                        message: '请填写标题'
                    }
                ],
                content: [
                    {
                        required: true,
                        message: '请填写正文'
                    }
                ]
            },
            // placeholder: '选择通知接收人员',
            staticParams: {
                // IsDepartmentTypeNode: true,
                DepartmentType: '1,2,4,5,6,7,8,9,10',
                CheckType: '0',
                ShowUserType: '3',
                // 如果是上级单位,此字段传true的话会拉管理的学校列表和下属上级单位列表
                IsIncludeOfficeSchool: true
            },
            // treeRangeText: '通知范围',
            // 上级单位才有筛选角色
            treeRangeList: [
                // 暂时没有这个选项,等后台支持了,放开即可
                // {
                //     label: '局内职工',
                //     value: 1,
                //     isChecked: true
                // },
                {
                    label: '教师',
                    value: 2,
                    isChecked: true
                },
                // {
                //     label: '学生',
                //     value: 3,
                //     isChecked: false
                // },
                {
                    label: '家长',
                    value: 4,
                    isChecked: false
                }
            ]
        };
    },
    methods: {
        loadData (item, resolve) {
            this.getTreeData(item, resolve);
        },
        searchData (item, resolve) {
            this.getTreeData(item, resolve);
        },
        async getTreeData (item, resolve) {
            let resp = await app.get('https:// TODO', this.$refs.XXXRef.buildParams(item));
            if (resp.ErrorCode === app.global.ErrorCode) {
                let nodes = resp.Data.Nodes;
                resolve(nodes);
            } else {
                resolve([], resp.ErrorMsg);
            }
        },
        userPickerOk (res) {
            this.articleModel.notifyRange = res.treeRangeValue;
        }
    },
    mounted() {
    },
    components: {
    }
};
</script>

业务项目引用完整示例 --- end ---

附:

自定义button,调起选人组件示例
模板:
<UserPicker
    :load-data="loadData"
    :search-data="searchData"
    ref="XXXRef"
    @on-click-ok="userPickerOk"
    v-model="articleModel.range" >
    <Button type="primary" @click="initUserPicker">自定义选人组件按钮</Button>
< /UserPicker>
事件:
methods: {
    initUserPicker () {
        // 调起选人组件,注意Ref要对应
        this.$refs.XXXRef.userPickerInit();
    },
    loadData (item, resolve) {
        this.getTreeData(item, resolve);
    },
    searchData (item, resolve) {
        this.getTreeData(item, resolve);
    },
    async getTreeData (item, resolve) {
        let resp = await app.get('https:// TODO', this.$refs.XXXRef.buildParams(item));
        if (resp.ErrorCode === app.global.ErrorCode) {
            let nodes = resp.Data.Nodes;
            resolve(nodes);
        } else {
            resolve([], resp.ErrorMsg);
        }
    },
    userPickerOk (res) {
        // 获取到选人结果
        this.articleModel.notifyRange = res.treeRangeValue;
    }
}

Contribution

Please make sure to read the Contributing Guide before making a pull request.

License

MIT