一、性能介绍

把消防查看过程中,须要手写填报的文档,在App端以表单填写进行实现。同时能够增加手写签名,关联照片,而且App端表单填报很多我的项目进行下拉抉择,极大的进步了工作效率;表单填报实现之后可通过零碎后盾生成word模板文件,App端下载到手机,通过手机连贯打印机,可把纸质文件进行打印。

App开发采纳APICloud AVM框架,后盾采纳PHP。

性能要点:

1、场合注销,分为九小场合和合用场合注销

2、监督查看记录

3、责令整改通知书

4、根本状况拍照,查看过程记录拍照

5、后盾针对上述数据进行多维度剖析,导出Excel表格,Word模板文件

二、思维导图

三、用到的模块

四、我的项目目录

五、开发介绍

1、首页导航

零碎首页应用tabLayout,能够将相干参数配置在JSON文件中,再在config.xml中将content的值设置成该JSON文件的门路。如果底部导航没有非凡需要这里强烈建议大家应用tabLayout为APP进行布局,官网曾经将各类手机屏幕及不同的分辨率进行了适配,免去了很多对于适配方面的问题。

{  "name": "root",  "textOffset": 6,  "color": "#999999",  "selectedColor": "#004494",  "scrollEnabled": false,  "hideNavigationBar": false,  "bgColor": "#fff",  "navigationBar": {      "background": "./images/navbk.png",      "shadow": "rgba(0,0,0,0)",      "color": "#fff",      "fontSize": 18,      "hideBackButton": true  },  "tabBar": {    "background": "#fff",    "shadow": "#eee",    "color": "#5E5E5E",    "selectedColor": "#004494",    "textOffset": 3,    "fontSize": 11,    "scrollEnabled": true,    "index": 0,    "preload": 1,    "frames": [      {        "title": "首页",        "name": "home",        "url": "./pages/index/home"      },      {        "title": "历史记录",        "name": "course",        "url": "./pages/history/records"      },      {        "title": "我的",        "name": "user",        "url": "./pages/user/wode"      }    ],    "list": [      {        "text": "首页",        "iconPath": "./images/home.png",        "selectedIconPath": "./images/home-o.png"      },      {        "text": "历史记录",        "iconPath": "./images/his.png",        "selectedIconPath": "./images/his-o.png"      },      {        "text": "我的",        "iconPath": "./images/my.png",        "selectedIconPath": "./images/my-o.png"      }    ]  }}

因为导航应用的tablayout,所有App初始化须要执行的操作,只须要在第一个加载的页面执行即可全局响应。可通过 tabBar中的"index"字段来确定第一个须要加载的页面,通过"preload"来确定须要预加载几个页面。

2、动静权限

动静全选的获取在第一个初始化的页面执行即可。本我的项目中须要用到存储、相机、相册3个权限。用到的是官网的API办法hasPermission

                //提醒获取存储权限                var limits=[];                var resultList = api.hasPermission({                    list: ['storage','camera','photos']                });                if (resultList[0].granted) {                    // 已受权,能够持续下一步操作                } else {                     limits.push(resultList[0].name);                }                if (resultList[1].granted) {                    // 已受权,能够持续下一步操作                } else {                     limits.push(resultList[1].name);                }                if (resultList[2].granted) {                    // 已受权,能够持续下一步操作                } else {                     limits.push(resultList[2].name);                }                if(limits.length>0){                    api.requestPermission({                        list: limits,                    }, function(res) {                        // console.log(JSON.stringify(res));                    });                }

manifest.xml文件,对于targetSdkVersion的值的大小,这里能够依据下文图片中的阐明,联合本人的我的项目须要上架的平台自行设置。

<?xml version="1.0" encoding="UTF-8"?><manifest>    <application name="targetSdkVersion" value="28"/></manifest>

3、音讯事件

本我的项目中通过发送事件sendEvent和监听事件addEventListener,音讯事件要学会正当的使用来晋升APP中各个页面之间交互的体验。上面就实现在表单提交胜利之后刷新列表页,登陆胜利之后跳转页面时从新加载用户信息具体的操作阐明以一下。

表单数据提交胜利之后,在回调里发送事件"addbase",而后敞开页面,跳转至列表页,在列表页的apiready中监听“addbase”事件,在监听胜利回调中执行刷新列表的操作。
 

onsubmit(e){                let result = e.detail.value;                 this.data.dwmc = result.dwmc?result.dwmc:this.data.dwmc;                this.data.dwdz = result.dwdz?result.dwdz:this.data.dwdz;                //省略其余字段                let params = {                        data:{                            values:{                                secret: Config.secret,                                userid: api.getPrefs({sync: true,key: 'userid'}),                                partid: api.getPrefs({sync: true,key: 'partid'}),                                id:this.data.id,                                dwmc:this.data.dwmc,                                dwdz:this.data.dwdz,                                //省略                            }                        }                    }                    api.showProgress();                    Model.addbase(params, (res,err) => {                        // console.log(JSON.stringify(res));                        // console.log(JSON.stringify(err));                        if (res && res.flag == 'Success') {                            api.toast({                                msg:'注销胜利'                            });                                api.sendEvent({                                name: 'addbase',                            });                            api.closeWin();                                                } else {                            api.toast({                                msg:res.msg                            })                        }                        api.hideProgress();                    });            },
            apiready(){                this.data.tab=api.pageParam.tab;                this.data.tabtitle=api.pageParam.tabtitle;                this.data.refresherTriggered = true;                this.loadData(false);                api.addEventListener({                    name: 'setuserinfo'                }, (ret, err) => {                    this.loadData(false);                });                //监听减少批改根本信息                api.addEventListener({                    name: 'addbase'                }, (ret, err) => {                    this.loadData(false);                });                api.addEventListener({                    name: 'delbase'                }, (ret, err) => {                    this.loadData(false);                });            },

4、接口调用

将接口调用和接口配置别离封装了2个JS插件,model.js和config.js。这样来对立治理,防止了在每个页面进行接口调用的时候都反复写一遍代码,无效的简化了每个性能页面的代码量,只须要在回调里专一写本人的业务逻辑即可。

import $util from "../../utils/util.js"import {Model} from "../../utils/model.js"import {Config} from "../../utils/config.js"

config.js

 class Config{    constructor(){}} Config.restUrl = 'http://xiaofang.*******.cn/api.php/Home/Index';Config.secret = '99d0fd93-***************************'; Config.addbase ='/addbase';//注销根本信息表Config.querylist ='/querylist';//查问注销单位列表Config.querybasebyid ='/querybasebyid';//查问注销单位根本信息详情Config.querybaseinfobyid ='/querybaseinfobyid';//查问注销单位根本信息详情Config.exportbase ='/exportbase';//下载注销单位根本信息Config.deletebasebyid ='/deletebasebyid';//删除注销单位根本信息Config.login ='/login';//登陆Config.getpart ='/getpart';//获取单位列表Config.register ='/register';//用户注册/**省略**/Config.checkUserStatus ='/checkUserStatus';//获取用户状态 export {Config}; 

model.js

import {Config} from './config.js'; class Model {  constructor() {}} /*注销根本信息表 */Model.addbase = function (param, callback){  param.url = Config.addbase;  param.method = 'post';  this.request(param, callback);} /*查问注销单位列表 */Model.querylist = function (param, callback){  param.url = Config.querylist;  param.method = 'post';  this.request(param, callback);} /*查问注销单位根本信息详情 */Model.querybasebyid = function (param, callback){  param.url = Config.querybasebyid;  param.method = 'post';  this.request(param, callback);} /*查问注销单位根本信息详情 */Model.querybaseinfobyid = function (param, callback){  param.url = Config.querybaseinfobyid;  param.method = 'post';  this.request(param, callback);} /*下载注销单位根本信息 */Model.exportbase = function (param, callback){  param.url = Config.exportbase;  param.method = 'post';  this.request(param, callback);} /*删除注销单位根本信息 */Model.deletebasebyid = function (param, callback){  param.url = Config.deletebasebyid;  param.method = 'post';  this.request(param, callback);} /*登陆模块 */Model.login = function (param, callback){  param.url = Config.login;  param.method = 'post';  this.request(param, callback);} /**省略**/ /*获取用户状态 */Model.checkUserStatus = function (param, callback){  param.url = Config.checkUserStatus;  param.method = 'post';  this.request(param, callback);} Model.request = function(p, callback) {  var param = p;  if (!param.headers) {      param.headers = {};  }    if (param.data && param.data.body) {      param.headers['Content-Type'] = 'application/json; charset=utf-8';  }  if (param.url) {      param.url = Config.restUrl + param.url;  }   api.ajax(param, function(ret, err) {      callback && callback(ret, err);  });} export {Model};

5、数据列表及分页查问

数据列表的展现,采纳scroll-view标签,通过onrefresherrefresh,onrefresherrefresh登程的事件中进行数据列表的刷新,和分页查问。refresher-triggered这个属性来设置以后下拉刷新状态,true 示意下拉刷新曾经被触发,false 示意下拉刷新未被触发。如果想默认下拉刷新一下能够在apiready中将之设置为true,以此来代替执行数据刷新操作。

如果列表中的每一项的元素较少,而且没有款式的特殊要求,也能够应用list-view来实现。

上面是以单位列表的残缺页面代码。其余页面的列表基本功能都是统一的,只是在每一项的款式及参数个数存在差别。
 

<template name='unitlist'>    <view class="page">        <scroll-view class="main" scroll-y enable-back-to-top refresher-enabled refresher-triggered={refresherTriggered} onrefresherrefresh={this.onrefresherrefresh} onscrolltolower={this.onscrolltolower}>            <view class="search-box">                <input class="serach-input"  placeholder="请输出单位名称检索" confirm-type="search" onconfirm="onconfirm" oninput={this.getKey}/>                <text class="search-btn" onclick="onconfirm">搜寻</text>            </view>            <view class="item-box">                <view class="item" data-id={item.id} onclick={this.openTable} v-for="(item, index) in list">                    <text class="item-content">{{item.name}}</text>                    <view class="item-sub">                        <view class="item-sub-box">                            <image class="item-sub-ico" src="../../images/DW.png" mode="aspectFit"></image>                            <text class="item-info">{{item.address}}</text>                        </view>                        <view class="item-sub-box">                            <image class="item-sub-ico" src="../../images/CT.png" mode="aspectFit"></image>                            <text class="item-info">{{item.type}}</text>                        </view>                    </view>                </view>            </view>            <view class="footer">                <text class="loadDesc">{loadStateDesc}</text>            </view>        </scroll-view>    </view></template><script>    import {Model} from '../../utils/model.js'    import {Config} from "../../utils/config.js"    import $util from "../../utils/util.js"    export default {        name: 'unitlist',        data() {            return{                list:[],                skip: 0,                loading: false,                refresherTriggered: false,                haveMoreData: true,                tab:'',                tabtitle:'',                key:''            }        },        computed: {            loadStateDesc(){                if (this.data.loading || this.data.haveMoreData) {                    return '加载中...';                } else if (this.list.length > 0) {                    return '没有更多啦';                } else {                    return '临时没有内容';                }            }        },        methods: {            apiready(){                this.data.tab=api.pageParam.tab;                this.data.tabtitle=api.pageParam.tabtitle;                this.data.refresherTriggered = true;                this.loadData(false);                api.addEventListener({                    name: 'setuserinfo'                }, (ret, err) => {                    this.loadData(false);                });                //监听减少批改根本信息                api.addEventListener({                    name: 'addbase'                }, (ret, err) => {                    this.loadData(false);                });                api.addEventListener({                    name: 'delbase'                }, (ret, err) => {                    this.loadData(false);                });            },            loadData(loadMore) {                this.data.loading = true;                var that = this;                var limit = 20;                var skip = loadMore?that.data.skip+1:0;                let params = {                    data:{                        values:{                            secret: Config.secret,                            userid: api.getPrefs({sync: true,key: 'userid'}),                            roleid: api.getPrefs({sync: true,key: 'roleid'}),                            partid: api.getPrefs({sync: true,key: 'partid'}),                            skip: skip,                            limit: limit,                            key:this.data.key                        }                    }                }                api.showProgress();                Model.querylist(params, (res,err) => {                    // console.log(JSON.stringify(res));                    // console.log(JSON.stringify(err));                    if (res && res.flag == 'Success') {                        let lists = res.data;                        that.data.haveMoreData = lists.length == limit;                        if (loadMore) {                            that.data.list = that.data.list.concat(lists);                        } else {                            that.data.list = lists;                        }                        that.data.skip = skip;                    } else {                        that.data.haveMoreData = false;                    }                    that.data.loading = false;                    that.data.refresherTriggered = false;                    api.hideProgress();                });            },            //关上填写表格            openTable(e) {                var id = e.currentTarget.dataset.id;                $util.openWin({                    name: this.data.tab,                    url: '../index/'+this.data.tab+'.stml',                    title: this.data.tabtitle,                    pageParam:{                        id:id                    }                });            },            /*下拉刷新页面*/            onrefresherrefresh(){                this.data.refresherTriggered = true;                this.loadData(false);            },            onscrolltolower() {                if (this.data.haveMoreData) {                    this.loadData(true);                }            },            getKey(e){                this.data.key = e.detail.value;            },            onconfirm(){                this.loadData(false);            }        }    }</script><style>    .main {        height: 100%;        background-color: #eaf0fa;    }    .item-box{        background-color: #fff;        margin: 5px;    }    .item{        border-bottom: 1px solid #efefef;        margin: 0 10px;        justify-content:flex-start;        flex-direction:column;    }    .item-content{        font-size: 17PX;        margin-top: 10px;    }    .item-info{        font-size: 13PX;        color: #666;        margin: 10px 0;    }    .item-sub{        justify-content:space-between;        flex-direction:row;    }    .footer {        height: 44px;        justify-content: center;        align-items: center;    }    .loadDesc {        width: 200px;        text-align: center;    }    .item-sub-ico{        width: 15px;        margin: 10px 0;    }    .item-sub-box{        flex-flow: row nowrap;    }    .search-box{        flex-flow: row nowrap;        align-items: center;        background-color: #2c6ddc;        border-radius: 5px;        margin: 5px;    }    .serach-input{        padding: 5px;        width: 80%;        height: 50px;        border-top-left-radius: 5px;        border-bottom-left-radius: 5px;    }    .search-btn{        width: 20%;        text-align: center;        color: #ffffff;    }</style>

6、双击退出程序

在首页页面和登陆页面中,增加双击退出程序性能,避免出现单击退出键呈现不必要的页面跳转失误。此监听事件要在apiready中执行。

            //监听返回  双击退出程序                api.setPrefs({                    key: 'time_last',                    value: '0'                });                api.addEventListener({                    name : 'keyback'                    }, function(ret, err) {                    var time_last = api.getPrefs({sync: true,key: 'time_last'});                    var time_now = Date.parse(new Date());                    if (time_now - time_last > 2000) {                        api.setPrefs({key:'time_last',value:time_now});                        api.toast({                            msg : '再按一次退出APP',                            duration : 2000,                            location : 'bottom'                        });                    } else {                        api.closeWidget({                            silent : true                        });                    }                });

7、账号有效性确认

因为后盾针对用户账号,启用了停用性能,后盾一旦设置账号停用,App中也应响应的将用户进行退出零碎操作。此操作在首页的apiready中进行执行。

             isLogin(){                if(!api.getPrefs({sync: true,key:'userid'})){                    $util.openWin({                        name: 'login',                        url: '../user/login.stml',                        title: '',                        hideNavigationBar:true                    });                }                else{                    let params = {                    data:{                        values:{                            secret: Config.secret,                            userid: api.getPrefs({sync: true,key:'userid'})                        }                    }                }                api.showProgress();                Model.checkUserStatus(params, (res,err) => {                    // console.log(JSON.stringify(res));                    // console.log(JSON.stringify(err));                    if (res && res.flag == 'Success') {                        if(ret.data=='02'){                            //分明缓存用户数据                            api.removePrefs({                                    key: 'name'                            });                            api.removePrefs({                                    key: 'userid'                            });                            api.removePrefs({                                    key: 'partname'                            });                            api.removePrefs({                                    key: 'partid'                            });                            api.removePrefs({                                    key: 'role'                            });                            api.removePrefs({                                    key: 'rolename'                            });                            api.removePrefs({                                    key: 'username'                            });                            //用户已停用 退出零碎                            $util.openWin({                                name: 'login',                                url: '../user/login.stml',                                title: '',                                hideNavigationBar:true                            });                        }                    } else {                        //革除用户信息                        api.removePrefs({                                key: 'name'                        });                        api.removePrefs({                                key: 'userid'                        });                        api.removePrefs({                                key: 'partname'                        });                        api.removePrefs({                                key: 'partid'                        });                        api.removePrefs({                                key: 'role'                        });                        api.removePrefs({                                key: 'rolename'                        });                        api.removePrefs({                                key: 'username'                        });                        //用户异样 退出从新登陆                        $util.openWin({                            name: 'login',                            url: '../user/login.stml',                            title: '',                            hideNavigationBar:true                        });                    }                                api.hideProgress();                });                }            }

8、表单提交、回显

表单应用的事AVM官网的 from组件,通过onsubmit进行表单数据的提交。其中次要用到了input、textarea、radio、checkbox;每个控件的具体应用办法,在官网文档中否有具体的介绍。上面就具体的代码示例进行展现。

页面代码 

<template name='addbase'>    <scroll-view class="page" scroll-y>        <form onsubmit={this.onsubmit}>            <view class="item">                <text>单位名称:</text>                <input name="dwmc" value={this.data.dwmc} placeholder="请输出单位名称"/>            </view>            <view class="item">                <text>单位地址:</text>                <input name="dwdz"  value={this.data.dwdz} placeholder="请输出单位具体地址"/>            </view>            <checkbox-group class="item" name="dwlb">                <text>单位类别:</text>                <view class="item-checkbox">                    <label v-for="item in dwlbarr">                        <checkbox value={item} v-bind:checked="this.data.seldwlb.indexOf(item)!=-1?true:false"/>                        <text>{item}</text>                    </label>                </view>                <input name="dwlb_qt" value={this.data.dwlb_qt} placeholder="请输出单位类别"/>            </checkbox-group>            <checkbox-group class="item" name="dwxz">                <text>单位性质:</text>                <view class="item-checkbox">                    <label v-for="item in dwxzarr">                        <checkbox value={item} v-bind:checked="this.data.seldwxz.indexOf(item)!=-1?true:false"/>                        <text>{item}</text>                    </label>                </view>            </checkbox-group>            <view class="item">                <text>职工总数:</text>                <input name="zgzs" value={this.data.zgzs} keyboard-type="number" placeholder="请输出单位职工总数"/>            </view>            <view class="item">                <text>消防安全责任人:</text>                <input name="xfaqzrr_xm" value={this.data.xfaqzrr_xm} placeholder="请输出负责人姓名"/>                <input name="xfaqzrr_zw" value={this.data.xfaqzrr_zw} placeholder="请输出负责人职务"/>                <input name="xfaqzrr_dh" value={this.data.xfaqzrr_dh} keyboard-type="number" placeholder="请输出负责人电话"/>            </view>            <view class="item">                <text>消防安全治理人:</text>                <input name="xfaqglr_xm" value={this.data.xfaqglr_xm} placeholder="请输出治理人姓名"/>                <input name="xfaqglr_zw" value={this.data.xfaqglr_zw} placeholder="请输出治理人职务"/>                <input name="xfaqglr_dh" value={this.data.xfaqglr_dh} keyboard-type="number" placeholder="请输出治理人电话"/>            </view>            <view class="item">                <text>专兼职防火干部:</text>                <input name="zjzfhgb_xm" value={this.data.zjzfhgb_xm} placeholder="请输出专兼职防火干部姓名"/>                <input name="zjzfhgb_zw" value={this.data.zjzfhgb_zw} placeholder="请输出专兼职防火干部职务"/>                <input name="zjzfhgb_dh" value={this.data.zjzfhgb_dh} keyboard-type="number" placeholder="请输出专兼职防火干部电话"/>            </view>            <view class="item">                <label class="label-box">                    <text class="label-title">修建层数(层)</text>                    <input class="label-input" name="jzcs" value={this.data.jzcs} keyboard-type="number" placeholder="请输出修建层数(层)"/>                </label>                <label class="label-box">                    <text class="label-title">所在层数(层)</text>                    <input class="label-input" name="szcs" value={this.data.szcs} keyboard-type="number" placeholder="请输出所在层数(层)"/>                </label>                <label class="label-box">                    <text class="label-title">修建高度(m)</text>                    <input class="label-input" name="jzgd" value={this.data.jzgd} keyboard-type="number" placeholder="请输出修建高度(m)"/>                </label>                <label class="label-box">                    <text class="label-title">总建筑面积(㎡)</text>                    <input class="label-input" name="zjzmj" value={this.data.zjzmj} keyboard-type="decimal" placeholder="请输出总建筑面积(㎡)"/>                </label>                <label class="label-box">                    <text class="label-title">每层建筑面积(㎡)</text>                    <input class="label-input" name="mcjzmj" value={this.data.mcjzmj} keyboard-type="decimal" placeholder="请输出每层建筑面积(㎡)"/>                </label>                <label class="label-box">                    <text class="label-title">营业面积(㎡)</text>                    <input class="label-input" name="yymj" value={this.data.yymj} keyboard-type="decimal" placeholder="请输出营业面积(㎡)"/>                </label>                <label class="label-box">                    <text class="label-title">查看工夫</text>                    <input class="label-input" name="jcsj" value={this.data.jcsj} keyboard-type="number" placeholder="请输出查看工夫"/>                </label>                <label class="label-box">                    <text class="label-title">投入使用工夫</text>                    <input class="label-input" name="trsysj" value={this.data.trsysj} keyboard-type="number" placeholder="请输出投入使用工夫"/>                </label>                <label class="label-box">                    <text class="label-title">停业工夫</text>                    <input class="label-input" name="kysj" value={this.data.kysj} keyboard-type="number" placeholder="请输出停业工夫"/>                </label>                <label class="label-box">                    <text class="label-title">租赁屋宇户主姓名</text>                    <input class="label-input" name="zlfwhzxm" value={this.data.zlfwhzxm} placeholder="请输出租赁屋宇户主姓名"/>                </label>            </view>            <view class="item">                <text>生产经营情况:</text>                <input name="scjyzk" value={this.data.scjyzk} placeholder="请输出单位生产经营情况"/>            </view>            <view class="item">                <text>附属社区:</text>                <input name="lssq" value={this.data.lssq} placeholder="请输出单位附属社区"/>            </view>            <radio-group class="item" name="ssyjfl">                <text>三色预警分类:</text>                <view class="item-checkbox">                    <label v-for="item in ssyjflarr">                        <radio value={item} v-bind:checked="this.data.ssyjfl==item?true:false"/>                        <text>{item}</text>                    </label>                </view>            </radio-group>             <view class="item">                <text>消防设置品种及数量:</text>                <textarea name="xfsszljsl" value={this.data.xfsszljsl} placeholder="请输出消防设置品种及数量"/>            </view>            <view class="item">                <text>查看注销状况:</text>                <textarea name="jcqkdj_1" value={this.data.jcqkdj_1} placeholder="请输出查看注销状况"/>                <textarea name="jcqkdj_2" value={this.data.jcqkdj_2} placeholder="请输出查看注销状况"/>                <textarea name="jcqkdj_3" value={this.data.jcqkdj_3} placeholder="请输出查看注销状况"/>                <textarea name="jcqkdj_4" value={this.data.jcqkdj_4} placeholder="请输出查看注销状况"/>            </view>            <view class="item">                <text>填表阐明:</text>                            </view>            <button class="btn-submit" type="submit">提交</button>        </form>        <button v-show="isdelete" class="btn-delete" type="button" @click="delbase">删除</button>    </scroll-view></template>
data() {            return{                dwmc:'',                dwdz:'',                dwlb:'',                dwxz:'',                zgzs:0,                xfaqzrr_xm:'',                xfaqzrr_zw:'',                xfaqzrr_dh:'',                xfaqglr_xm:'',                xfaqglr_zw:'',                xfaqglr_dh:'',                zjzfhgb_xm:'',                zjzfhgb_zw:'',                zjzfhgb_dh:'',                jzcs:null,                jzgd:null,                zjzmj:null,                mcjzmj:null,                szcs:null,                yymj:null,                jcsj:'',                trsysj:'',                kysj:'',                zlfwhzxm:'',                scjyzk:'',                lssq:'',                ssyjfl:'',                xfsszljsl:'',                jcqkdj_1:'',                jcqkdj_2:'',                jcqkdj_3:'',                jcqkdj_4:'',                dwlb_qt:'',                id:0,                ssyjflarr:['红','黄','绿'],                dwlbarr:['购物场合','餐饮场合','住宿场合','公共娱乐场所','休闲健身场合','医疗场合','教学场合','生产加工企业','易燃易爆危险品销售、贮存场合','其余'],                dwxzarr:['国有','个体','股份合作公司','股份有限公司','港澳台投资','中外合资','个体私营','其余'],                seldwlb:[],                seldwxz:[],                isdelete:false,                dateList: [$formatDate.lastYear30(),[1,2,3,4,5,6,7,8,9,10,11,12],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]],                jcsjSelectorValue:[0,0,0],                trsysjSelectorValue:[0,0,0],                kysjSelectorValue:[0,0,0]            }        },

表单提交

onsubmit(e){                let result = e.detail.value;                this.data.dwmc = result.dwmc?result.dwmc:this.data.dwmc;                this.data.dwdz = result.dwdz?result.dwdz:this.data.dwdz;                this.data.dwlb = result.dwlb?result.dwlb.join(','):this.data.dwlb;                this.data.dwlb_qt = result.dwlb_qt?result.dwlb_qt:this.data.dwlb_qt;                this.data.dwxz = result.dwxz?result.dwxz.join(','):this.data.dwxz;                this.data.zgzs = result.zgzs?result.zgzs:this.data.zgzs;                this.data.xfaqzrr_xm = result.xfaqzrr_xm?result.xfaqzrr_xm:this.data.xfaqzrr_xm;                this.data.xfaqzrr_zw = result.xfaqzrr_zw?result.xfaqzrr_zw:this.data.xfaqzrr_zw;                this.data.xfaqzrr_dh = result.xfaqzrr_dh?result.xfaqzrr_dh:this.data.xfaqzrr_dh;                this.data.xfaqglr_xm = result.xfaqglr_xm?result.xfaqglr_xm:this.data.xfaqglr_xm;                this.data.xfaqglr_zw = result.xfaqglr_zw?result.xfaqglr_zw:this.data.xfaqglr_zw;                this.data.xfaqglr_dh = result.xfaqglr_dh?result.xfaqglr_dh:this.data.xfaqglr_dh;                this.data.zjzfhgb_xm = result.zjzfhgb_xm?result.zjzfhgb_xm:this.data.zjzfhgb_xm;                this.data.zjzfhgb_zw = result.zjzfhgb_zw?result.zjzfhgb_zw:this.data.zjzfhgb_zw;                this.data.zjzfhgb_dh = result.zjzfhgb_dh?result.zjzfhgb_dh:this.data.zjzfhgb_dh;                this.data.jzcs = result.jzcs?result.jzcs:this.data.jzcs;                this.data.jzgd = result.jzgd?result.jzgd:this.data.jzgd;                this.data.zjzmj = result.zjzmj?result.zjzmj:this.data.zjzmj;                this.data.mcjzmj = result.mcjzmj?result.mcjzmj:this.data.mcjzmj;                this.data.szcs = result.szcs?result.szcs:this.data.szcs;                this.data.yymj = result.yymj?result.yymj:this.data.yymj;                this.data.jcsj = result.jcsj?result.jcsj:this.data.jcsj;                this.data.trsysj = result.trsysj?result.trsysj:this.data.trsysj;                this.data.kysj = result.kysj?result.kysj:this.data.kysj;                this.data.zlfwhzxm = result.zlfwhzxm?result.zlfwhzxm:this.data.zlfwhzxm;                this.data.scjyzk = result.scjyzk?result.scjyzk:this.data.scjyzk;                this.data.lssq = result.lssq?result.lssq:this.data.lssq;                this.data.ssyjfl = result.ssyjfl?result.ssyjfl:this.data.ssyjfl;                this.data.xfsszljsl = result.xfsszljsl?result.xfsszljsl:this.data.xfsszljsl;                this.data.jcqkdj_1 = result.jcqkdj_1?result.jcqkdj_1:this.data.jcqkdj_1;                this.data.jcqkdj_2 = result.jcqkdj_1?result.jcqkdj_2:this.data.jcqkdj_2;                this.data.jcqkdj_3 = result.jcqkdj_1?result.jcqkdj_3:this.data.jcqkdj_3;                this.data.jcqkdj_4 = result.jcqkdj_1?result.jcqkdj_4:this.data.jcqkdj_4;                 if(this.data.dwmc==''){                    api.toast({                        msg:'单位名称不能为空!'                    });                    return false;                }                if(this.data.dwdz==''){                    api.toast({                        msg:'单位地址不能为空!'                    });                    return false;                }                if(this.data.dwlb==''){                    api.toast({                        msg:'单位类别不能为空!'                    });                    return false;                }                if(this.data.dwxz==''){                    api.toast({                        msg:'单位性质不能为空!'                    });                    return false;                }                let params = {                        data:{                            values:{                                secret: Config.secret,                                userid: api.getPrefs({sync: true,key: 'userid'}),                                id:this.data.id,                                dwmc:this.data.dwmc,                                dwdz:this.data.dwdz,                                dwlb:this.data.dwlb,                                dwxz:this.data.dwxz,                                zgzs:this.data.zgzs,                                xfaqzrr_xm:this.data.xfaqzrr_xm,                                xfaqzrr_zw:this.data.xfaqzrr_zw,                                xfaqzrr_dh:this.data.xfaqzrr_dh,                                xfaqglr_xm:this.data.xfaqglr_xm,                                xfaqglr_zw:this.data.xfaqglr_zw,                                xfaqglr_dh:this.data.xfaqglr_dh,                                zjzfhgb_xm:this.data.zjzfhgb_xm,                                zjzfhgb_zw:this.data.zjzfhgb_zw,                                zjzfhgb_dh:this.data.zjzfhgb_dh,                                jzcs:this.data.jzcs,                                jzgd:this.data.jzgd,                                zjzmj:this.data.zjzmj,                                mcjzmj:this.data.mcjzmj,                                szcs:this.data.szcs,                                yymj:this.data.yymj,                                jcsj:this.data.jcsj,                                trsysj:this.data.trsysj,                                kysj:this.data.kysj,                                zlfwhzxm:this.data.zlfwhzxm,                                scjyzk:this.data.scjyzk,                                lssq:this.data.lssq,                                ssyjfl:this.data.ssyjfl,                                xfsszljsl:this.data.xfsszljsl,                                jcqkdj_1:this.data.jcqkdj_1,                                jcqkdj_2:this.data.jcqkdj_2,                                jcqkdj_3:this.data.jcqkdj_3,                                jcqkdj_4:this.data.jcqkdj_4,                                dwlb_qt:this.data.dwlb_qt                            }                        }                    }                    api.showProgress();                    Model.addbase(params, (res,err) => {                        // console.log(JSON.stringify(res));                        // console.log(JSON.stringify(err));                        if (res && res.flag == 'Success') {                            api.toast({                                msg:'注销胜利'                            });                                api.sendEvent({                                name: 'addbase',                            });                            api.closeWin();                                                } else {                            api.toast({                                msg:res.msg                            })                        }                        api.hideProgress();                    });            },

数据回显 

//查问已增加的数据            loadData(){                let params = {                    data:{                        values:{                            secret: Config.secret,                            id:this.data.id                        }                    }                }                api.showProgress();                Model.querybasebyid(params, (res,err) => {                    // console.log(JSON.stringify(res));                    // console.log(JSON.stringify(err));                    if (res && res.flag == 'Success') {                        //填充数据                            let result=res.data;                                                this.data.dwmc = result.dwmc?result.dwmc:this.data.dwmc;                        this.data.dwdz = result.dwdz?result.dwdz:this.data.dwdz;                        this.data.seldwlb = result.dwlb?result.dwlb.split(','):this.data.dwlb;                        this.data.dwlb_qt = result.dwlb_qt?result.dwlb_qt:this.data.dwlb_qt;                        this.data.seldwxz = result.dwxz?result.dwxz.split(','):this.data.dwxz;                        this.data.zgzs = result.zgzs?result.zgzs:this.data.zgzs;                        this.data.xfaqzrr_xm = result.xfaqzrr_xm?result.xfaqzrr_xm:this.data.xfaqzrr_xm;                        this.data.xfaqzrr_zw = result.xfaqzrr_zw?result.xfaqzrr_zw:this.data.xfaqzrr_zw;                        this.data.xfaqzrr_dh = result.xfaqzrr_dh?result.xfaqzrr_dh:this.data.xfaqzrr_dh;                        this.data.xfaqglr_xm = result.xfaqglr_xm?result.xfaqglr_xm:this.data.xfaqglr_xm;                        this.data.xfaqglr_zw = result.xfaqglr_zw?result.xfaqglr_zw:this.data.xfaqglr_zw;                        this.data.xfaqglr_dh = result.xfaqglr_dh?result.xfaqglr_dh:this.data.xfaqglr_dh;                        this.data.zjzfhgb_xm = result.zjzfhgb_xm?result.zjzfhgb_xm:this.data.zjzfhgb_xm;                        this.data.zjzfhgb_zw = result.zjzfhgb_zw?result.zjzfhgb_zw:this.data.zjzfhgb_zw;                        this.data.zjzfhgb_dh = result.zjzfhgb_dh?result.zjzfhgb_dh:this.data.zjzfhgb_dh;                        this.data.jzcs = result.jzcs?result.jzcs:this.data.jzcs;                        this.data.jzgd = result.jzgd?result.jzgd:this.data.jzgd;                        this.data.zjzmj = result.zjzmj?result.zjzmj:this.data.zjzmj;                        this.data.mcjzmj = result.mcjzmj?result.mcjzmj:this.data.mcjzmj;                        this.data.szcs = result.szcs?result.szcs:this.data.szcs;                        this.data.yymj = result.yymj?result.yymj:this.data.yymj;                        this.data.jcsj = result.jcsj?result.jcsj:this.data.jcsj;                        this.data.trsysj = result.trsysj?result.trsysj:this.data.trsysj;                        this.data.kysj = result.kysj?result.kysj:this.data.kysj;                        this.data.zlfwhzxm = result.zlfwhzxm?result.zlfwhzxm:this.data.zlfwhzxm;                        this.data.scjyzk = result.scjyzk?result.scjyzk:this.data.scjyzk;                        this.data.lssq = result.lssq?result.lssq:this.data.lssq;                        this.data.ssyjfl = result.ssyjfl?result.ssyjfl:this.data.ssyjfl;                        this.data.xfsszljsl = result.xfsszljsl?result.xfsszljsl:this.data.xfsszljsl;                        this.data.jcqkdj_1 = result.jcqkdj_1?result.jcqkdj_1:this.data.jcqkdj_1;                        this.data.jcqkdj_2 = result.jcqkdj_1?result.jcqkdj_2:this.data.jcqkdj_2;                        this.data.jcqkdj_3 = result.jcqkdj_1?result.jcqkdj_3:this.data.jcqkdj_3;                        this.data.jcqkdj_4 = result.jcqkdj_1?result.jcqkdj_4:this.data.jcqkdj_4;                                            } else {                        api.toast({                            msg:res.msg                        })                    }                    api.hideProgress();                });            },

9、拍照及上传照片,图片预览

拍照应用的是FNPhotograph模块,自带UI的open接口,可抉择拍照照片的品质,可配置应用摄像头方向,同时可配置照片不必存储到相册中,禁用显示相册按钮,保障用户只能现场拍照,能够满足我的项目需要。

我的项目中很多页面波及到图片预览的性能,分为单图预览和多图预览。图片预览采纳的是photoBrowser 模块。photoBrowser 是一个图片浏览器,反对单张、多张图片查看的性能,可放大放大图片,反对本地和网络图片资源。若是网络图片资源则会被缓存到本地,缓存到本地上的资源能够通过 clearCache 接口手动革除。同时本模块反对横竖屏显示,在本app反对横竖屏的状况下,本模块底层会主动监听以后设施的地位状态,主动适配横竖屏以展现图片。应用此模块开发者看实现炫酷的图片浏览器。
 

            getPicture(e){                this.data.type = e.currentTarget.dataset.type;                api.actionSheet({                    title: '请抉择',                    cancelTitle: '勾销',                    buttons: ['抉择图片','图片预览']                }, (ret, err)=> {                    // console.log(JSON.stringify(ret));                    // console.log(JSON.stringify(err));                    // var index = ret.buttonIndex;                    if(ret.buttonIndex==1){                        var FNPhotograph = api.require('FNPhotograph');                        FNPhotograph.open({                            album: true ,                            quality: 'medium'                        }, (ret)=>{                            // console.log(JSON.stringify(ret));                            if(ret.eventType=='takePhoto'){                                FNPhotograph.close();                                //上传图片                                let params = {                                    data:{                                        values:{                                            secret: Config.secret,                                            baseid:this.data.baseid,                                            type:this.data.type                                        },                                        files:{                                            'file':ret.imagePath,                                        }                                    }                                }                                api.showProgress();                                Model.addbasepicbyid(params, (res,err) => {                                    // console.log(JSON.stringify(res));                                    // console.log(JSON.stringify(err));                                    if (res && res.flag == 'Success') {                                            if(this.data.type=='01'){                                            this.data.src1=res.data;                                        }                                        else if(this.data.type=='02'){                                            this.data.src2=res.data;                                        }                                        else if(this.data.type=='03'){                                            this.data.src3=res.data;                                        }                                        else if(this.data.type=='04'){                                            this.data.src4=res.data;                                        }                                    } else {                                        api.toast({                                            msg:res.msg                                        })                                    }                                    api.hideProgress();                                });                                                        }                        });                    }                    else if(ret.buttonIndex==2){                        //图片预览                        let src='';                        if(this.data.type=='01'){                            src=this.data.src1;                        }                        else if(this.data.type=='02'){                            src=this.data.src2;                        }                        else if(this.data.type=='03'){                            src=this.data.src3;                        }                        else if(this.data.type=='04'){                            src=this.data.src4;                        }                        var photoBrowser = api.require('photoBrowser');                        photoBrowser.open({                            images: [                                src                            ],                            placeholderImg: 'widget://res/img/apicloud.png',                            bgColor: '#000'                        }, (ret, err) => {                            if (ret) {                                if(ret.eventType=='click'){                                    photoBrowser.close();                                }                            } else {                                api.toast({                                    msg:'图片预览失败'                                })                            }                        });                    }                });                            }

10、页面之间的跳转和参数传递

分装工具类until.js,在其中定义了openWin办法来实现页面之间的跳转。页面跳转时参数的传递通过pageParam增加参数进行传递,在跳转到的页面通过api.pageParam.xxx在paiready中进行接管

<view class="tab-item" data-url="addbase" data-title="九小场合注销" tapmode @click="openPage">    <image class="tab-item-logo" src="../../images/JB.png" mode="scaleToFill"></image>    <text class="tab-item-title"> 九小场合注销</text></view>
        methods: {            apiready(){//like created                this.data.id=api.pageParam.id;            },            openPage(e){                let title = e.currentTarget.dataset.title;                let url = e.currentTarget.dataset.url;                $util.openWin({                    name: url,                    url: '../index/'+url+'.stml',                    title: title,                    pageParam:{                        id:this.data.id                    }                });            }        }

util.js

const $util = {    openWin(param){        var param = {            name: param.name,            url: param.url,            title: param.title||'',            pageParam: param.pageParam||{},            hideNavigationBar: param.hideNavigationBar || false,            navigationBar:{                background:'../../images/navbk.png',                shadow: '#fff',                color: '#fff'            }        };        if (this.isApp()) {            api.openTabLayout(param);        } else {            api.openWin(param);        }    },    isApp(){        if (api.platform && api.platform == 'app') {            return true;        }        return false;    },    fitRichText(richtext, width){        var str = `<img style="max-width:${width}px;"`;        var result = richtext.replace(/\<img/gi, str);        return result;    }}export default $util;

11、导航栏自定义按钮点击事件

如果是首页加载的页面,能够在首页中通过索引index进行判断而后别离配置;如果在独自的页面中须要增加的话,可在页面的apiready中进行配置。

首页中的配置,在首页中配置的话须要留神点是,如果是页面间接的跳转的话配置多个页面时没有问题,然而如果按钮事件是执行某个页面具体的办法的时候,就会呈现问题。这里倡议如果按钮事件是执行某个页面具体的办法,不要在首页中配置,可在页面中通过其余形式进行实现。因为首页配置的内容会在全局应用,而且加载胜利之后,通过tabbar切换页面的时候,是不会进行页面刷新操作的。
 

apiready() {        //导航设置            api.addEventListener({                name:'tabitembtn'            }, (ret) => {                api.setTabBarAttr({                    index: ret.index                });                if(ret.index==0){                    api.setTabLayoutAttr({                        hideNavigationBar:true,                        animated:false                    });                }                else if(ret.index==2){                    api.setNavBarAttr({                        rightButtons: [{                            iconPath:'widget://image/chart.png'                        }]                    });                     api.setTabLayoutAttr({                        hideNavigationBar:false,                        animated:false                    });                    api.addEventListener({                        name:'navitembtn'                    }, (ret)=>{                        if(ret.type=='right'){                            $util.openWin({                                name: 'chart',                                url: 'widget://html/test.html',                                title: '统计分析',                                pageParam:{                                                                    }                            })                        }                    })                }                else{                     api.setTabLayoutAttr({                        hideNavigationBar:false,                        animated:false                    });                    api.setNavBarAttr({                        rightButtons: [{                        }]                    });                    api.addEventListener({                        name:'navitembtn'                    }, (ret)=>{                                            })                }            });    },

独自页面中的配置

            apiready(){                            //增加右上角按钮                api.setNavBarAttr({                    rightButtons: [{                        text: '增加'                    }]                });                //监听右上角按钮点击事件                api.addEventListener({                    name: 'navitembtn'                }, (ret, err)=> {                    if (ret.type == 'right') {                        $util.openWin({                            name: 'addjcpics',                            url: 'addjcpics.stml',                            title: '增加查看记录照片',                            pageParam:{                                baseid:this.data.baseid                            }                        });                    }                });                            },

12、手写签名

手写签名用到的是 drawingBoard模块,drawingBoard 模块是一个手写签名模块。开发者可自定义个固定宽高(w、h)的 “frame”,该 “frame” 即是可手写签名的背景通明的画板,可将此画板固定在指定的 frame 或 window 上,从而自定义出合乎本人需要的各种 UI 成果的签名性能。

<template name='signature'>    <view class="page">        <view class="flowbottom">            <button class="btn-clear" tapmode @click="clear">重写</button>            <button class="btn" tapmode @click="submit" disabled={this.data.btn_disabled}>确定</button>        </view>    </view></template><script>    export default {        name: 'signature',        data() {            return{                btn_disabled:false,                type:''            }        },        methods: {            apiready(){                this.data.type = api.pageParam.type;                var drawingBoard = api.require('drawingBoard');                drawingBoard.open({                    rect: {                        x: 10,                        y: 100,                        w: api.frameWidth-20,                        h: (api.frameWidth-20)/2                    },                    styles: {                        brush: {                            color: '#000000',                            width: 3                        },                        bgColor: '#f0f0f0'                    },                    fixedOn: api.frameName                });            },            clear(){                var drawingBoard = api.require('drawingBoard');                drawingBoard.clear();            },            submit(){                this.data.btn_disabled = true;                var drawingBoard = api.require('drawingBoard');                drawingBoard.save({                    savePath: 'fs://drawingBoard/'+Date.now()+'.png',                    copyToAlbum: false                }, (ret)=> {                    // console.log(JSON.stringify(ret));                    if(ret.absolutePath=='undefined'){                        this.data.btn_disabled = false;                        api.toast({                            msg:'签名失败,请稍后再试'                        });                    }                    else{                        //                        api.sendEvent({                            name: 'singture_success',                            extra: {                                src: ret.absolutePath,                                type:this.data.type                            }                        });                        drawingBoard.close();                        api.closeWin();                    }                });            }        }    }</script><style>    .page {        display: flex;        flex-flow: row nowrap;        height: 100%;        width: 100%;        background-color: #eaf0fa;    }    .flowbottom{        width: 100%;        align-self: flex-end;        padding: 10px;    }    .btn {        display: block;        height: 50px;        width: 100%;        background:#1492ff;        border-radius: 5px;        color: #fff;        font-size: 20px;        font-weight: bolder;        padding: 0;        margin-top: 10px;    }    .btn-clear {        display: block;        height: 50px;        width: 100%;        background:#ff0000;        border-radius: 5px;        color: #fff;        font-size: 20px;        font-weight: bolder;        padding: 0;        margin-top: 10px;    }</style>

13、革除缓存

因为我的项目中有很多拍照,查看照片,在应用的过程中,就会产生很多的缓存,缓存多了会导致利用反馈变慢。所以在利用中减少了分明缓存的性能,用的是官网提供的api.clearCache。

在集体核心 apiready中先获取到利用中的缓存,而后点击革除缓存按钮即可革除。

<view class="item" onclick="clearCache">    <image class="item-icon" src="../../images/w_02.png" mode="widthFix"></image>    <text class="item-title">缓存</text>    <text class="item-right-cache">{cache}M</text></view>
          apiready(){                //获取APP缓存 异步返回后果:                api.getCacheSize((ret) => {                    this.data.cache = parseInt(ret.size/1024/1024).toFixed(1);                });                    },            clearCache(){                api.clearCache(() => {                    api.toast({                        msg: '革除实现'                    });                });                this.data.cache=0;            },

14、下载并关上word文件

点击下载word文件按钮,调用零碎接口,接口会把文件的门路进行返回,在接口会调用先通过api.download将文件下载到本地,而后通过模块docInteraction调用第三方APP打开文档。

                   //监听右上角按钮点击事件                    api.addEventListener({                        name: 'navitembtn'                    }, (ret, err) => {                        if (ret.type == 'right') {                             let params = {                                data:{                                    values:{                                        secret: Config.secret,                                        id:this.data.id                                    }                                }                            }                            api.showProgress();                            Model.exportbase(params, (res,err) => {                                if (res && res.flag == 'Success') {                                                                      //下载文件                                    api.download({                                        url: res.data,                                        report: true,                                        cache: false,                                        allowResume: true                                    }, (ret, err)=> {                                        // console.log(JSON.stringify(ret));                                        if (ret.state == 1) {                                                                                  //下载胜利 跳转WORD预览页面                                            var docInteraction =                                             api.require('docInteraction');                                            docInteraction.open({                                                path: ret.savePath                                            }, (ret, err) => {                                            });                                        } else {                                            if(ret.percent>0){                                                api.toast({                                                    msg:'正在下载'+ret.percent+'%'                                                })                                            }                                            else{                                                api.toast({                                                    msg:'下载失败,请稍后再试'                                                })                                            }                                        }                                    });                                                                   } else {                                    api.toast({                                        msg:'下载失败,请稍后再试'                                    })                                }                                api.hideProgress();                            });                        }                                          });

15、登录、退出

通过api.setPrefs存储用户登录信息,退出登录清空数据。

//登陆APP            submit() {                var that = this;                var user = that.data.user;                var psw = that.data.psw;                if (!user) {                    this.showToast("姓名不能为空");                    return;                }                if (!psw) {                    this.showToast("明码不能为空");                    return;                }                  api.showProgress();                const params = {                    data: {                        values:{                            secret: Config.secret,                            user:user,                            psw:psw                        }                    }                };                Model.login(params, (res,err) => {                    // console.log(JSON.stringify(res));                    // console.log(JSON.stringify(err));                    if (res && res.flag == "Success") {                        that.showToast("提交胜利");                        api.setPrefs({key:'name',value:res.data.name});                        api.setPrefs({key:'userid',value:res.data.id});                        api.setPrefs({key:'roleid',value:res.data.role});                        api.setPrefs({key:'rolename',value:res.data.rolename});                        api.setPrefs({key:'partid',value:res.data.part});                        api.setPrefs({key:'partname',value:res.data.partname});                        api.setPrefs({key:'username',value:res.data.username});                                     api.toast({                            msg:'登陆胜利,欢送应用'                        })                         api.sendEvent({                            name: 'setuserinfo',                        });                        api.closeWin();                    } else {                        that.showToast('登陆失败,请稍后再试');                    }                    api.hideProgress();                });            },

api.setPrefs设置偏好数据,数据会存储到本地文件系统。api.removePrefs革除本地存储的数据。

loginout(){                api.confirm({                    title: '提醒',                    msg: '确定要退出登录?',                    buttons: ['确定', '勾销']                }, (ret, err) => {                    var index = ret.buttonIndex;                    if(index == 1){                        //革除用户信息                        api.removePrefs({                                key: 'name'                        });                        api.removePrefs({                                key: 'userid'                        });                        api.removePrefs({                                key: 'partname'                        });                        api.removePrefs({                                key: 'partid'                        });                        api.removePrefs({                                key: 'role'                        });                        api.removePrefs({                                key: 'rolename'                        });                        api.removePrefs({                                key: 'username'                        });                         api.toast({                            msg:'请从新登陆APP'                        })                        $util.openWin({                            name: 'login',                            url: '../user/login.stml',                            title: '',                            hideNavigationBar:true                        });                    }                });            }

后盾接口

导出word用到了PhpWord,通过composer进行装置,而后再须要调用的中央间接调用,具体应用办法请参代码中示例;其中导出word模板文件有波及到图片的导出。

<?phpnamespace Home\Controller;use Think\Controller;class IndexController extends Controller {    //用户登陆    public function login(){        checkscret('secret');//验证受权码        checkdataPost('user');//用户名        checkdataPost('psw');//明码         $user=$_POST['user'];        $psw=$_POST['psw'];         $map['username']=$user;        $map['password']=$psw;         $map['status']='01';//注册之后 须要审核一下         $releaseInfo=M()->table('user')->field('id,name,username,part,role,getrolename(role) rolename,getpartname(part) partname')->where($map)->find();                  if($releaseInfo){          returnApiSuccess('查问胜利',$releaseInfo);        }        else{          returnApiError('查问失败!');          exit();        }     }    //用户注册    public function register(){        checkscret('secret');//验证受权码        checkdataPost('username');//用户名        checkdataPost('password');//明码         $username=$_POST['username'];        $name=$_POST['name'];        $password=$_POST['password'];        $part=$_POST['part'];         $data['username']=$username;        $data['name']=$name;        $data['password']=$password;        $data['part']=$part;        $data['role']=3;        $data['status']='02';//已注册未审核         $releaseInfo=M()->table('user')->data($data)->add();                  if($releaseInfo){          returnApiSuccess('注册胜利',$releaseInfo);        }        else{          returnApiError('注册失败!');          exit();        }    }     //根本信息注销    public function addbase(){        checkscret('secret');//验证受权码        checkdataPost('userid');        checkdataPost('partid');           //对应字段        $dwmc=$_POST['dwmc'];        $dwdz=$_POST['dwdz'];        $dwlb=$_POST['dwlb'];        $dwxz=$_POST['dwxz'];        $zgzs=$_POST['zgzs'];        $xfaqzrr_xm=$_POST['xfaqzrr_xm'];        $xfaqzrr_zw=$_POST['xfaqzrr_zw'];        $xfaqzrr_dh=$_POST['xfaqzrr_dh'];        $xfaqglr_xm=$_POST['xfaqglr_xm'];        $xfaqglr_zw=$_POST['xfaqglr_zw'];        $xfaqglr_dh=$_POST['xfaqglr_dh'];        $zjzfhgb_xm=$_POST['zjzfhgb_xm'];        $zjzfhgb_zw=$_POST['zjzfhgb_zw'];        $zjzfhgb_dh=$_POST['zjzfhgb_dh'];        $jzcs=$_POST['jzcs'];        $jzgd=$_POST['jzgd'];        $zjzmj=$_POST['zjzmj'];        $mcjzmj=$_POST['mcjzmj'];        $szcs=$_POST['szcs'];        $yymj=$_POST['yymj'];        $jcsj=$_POST['jcsj'];        $trsysj=$_POST['trsysj'];        $kysj=$_POST['kysj'];        $zlfwhzxm=$_POST['zlfwhzxm'];        $scjyzk=$_POST['scjyzk'];        $lssq=$_POST['lssq'];        $ssyjfl=$_POST['ssyjfl'];        $xfsszljsl=$_POST['xfsszljsl'];        $jcqkdj_1=$_POST['jcqkdj_1'];        $jcqkdj_2=$_POST['jcqkdj_2'];        $jcqkdj_3=$_POST['jcqkdj_3'];        $jcqkdj_4=$_POST['jcqkdj_4'];        $dwlb_qt=$_POST['dwlb_qt'];         $userid=$_POST['userid'];        $partid=$_POST['partid'];         $id=$_POST['id'];           //数据        $data['dwmc']=$dwmc;        $data['dwdz']=$dwdz;        $data['dwlb']=$dwlb;        $data['dwxz']=$dwxz;        $data['zgzs']=$zgzs;        $data['xfaqzrr_xm']=$xfaqzrr_xm;        $data['xfaqzrr_zw']=$xfaqzrr_zw;        $data['xfaqzrr_dh']=$xfaqzrr_dh;        $data['xfaqglr_xm']=$xfaqglr_xm;        $data['xfaqglr_zw']=$xfaqglr_zw;        $data['xfaqglr_dh']=$xfaqglr_dh;        $data['zjzfhgb_xm']=$zjzfhgb_xm;        $data['zjzfhgb_zw']=$zjzfhgb_zw;        $data['zjzfhgb_dh']=$zjzfhgb_dh;        $data['jzcs']=$jzcs;        $data['jzgd']=$jzgd;        $data['zjzmj']=$zjzmj;        $data['mcjzmj']=$mcjzmj;        $data['szcs']=$szcs;        $data['yymj']=$yymj;        $data['jcsj']=$jcsj;        $data['trsysj']=$trsysj;        $data['kysj']=$kysj;        $data['zlfwhzxm']=$zlfwhzxm;        $data['scjyzk']=$scjyzk;        $data['lssq']=$lssq;        $data['ssyjfl']=$ssyjfl;        $data['xfsszljsl']=$xfsszljsl;        $data['jcqkdj_1']=$jcqkdj_1;        $data['jcqkdj_2']=$jcqkdj_2;        $data['jcqkdj_3']=$jcqkdj_3;        $data['jcqkdj_4']=$jcqkdj_4;        $data['dwlb_qt']=$dwlb_qt;         $data['userid']=$userid;        $data['partid']=$partid;        $data['create_time']=time();                if($id){            $map['id']=$id;              //插入数据            $releaseInfo=M()->table('base')->where($map)->save($data);        }        else{              //插入数据            $releaseInfo=M()->table('base')->data($data)->add();        }          if($releaseInfo){          returnApiSuccess('注销胜利',$releaseInfo);        }        else{          returnApiError( '注销失败,请稍后再试');          exit();        }    }     //删除注销信息    public function deletebasebyid(){        checkscret('secret');//验证受权码        checkdataPost('id');         $id=$_POST['id'];         $map['id']=$id;         $releaseInfo=M()->table('base')->where($map)->delete();                  if($releaseInfo){          returnApiSuccess('删除胜利',$releaseInfo);        }        else{          returnApiError('删除失败!');          exit();        }    }     //查问注销单位列表    public function querylist(){        checkscret('secret');//验证受权码        checkdataPost('limit');//下一次加载多少条        checkdataPost('userid');         $limit=$_POST['limit'];        $skip=$_POST['skip'];        if(empty($skip)){          $skip=0;        }         $userid=$_POST['userid'];         $map['userid']=$userid;         $releaseInfo=M()->table('base')->field('id,dwmc as name,dwdz as address,dwlb as type')->where($map)->limit($skip*$limit,$limit)->order('create_time desc')->select();                  if($releaseInfo){          returnApiSuccess('查问胜利',$releaseInfo);        }        else{          returnApiError('查问失败!');          exit();        }    }     //查问单位根本信息详情    public function querybasebyid(){        checkscret('secret');//验证受权码        checkdataPost('id');//ID         $id=$_POST['id'];         $map['id']=$id;         $releaseInfo=M()->table('base')->where($map)->find();                  if($releaseInfo){          returnApiSuccess('查问胜利',$releaseInfo);        }        else{          returnApiError('查问失败!');          exit();        }    }     //查问根本信息    public function querybaseinfobyid(){        checkscret('secret');//验证受权码        checkdataPost('id');//ID         $id=$_POST['id'];         $map['id']=$id;         $releaseInfo=M()->table('base')->field('dwmc,dwdz,dwxz,jzgd,jzcs,yymj')->where($map)->find();                  if($releaseInfo){          returnApiSuccess('查问胜利',$releaseInfo);        }        else{          returnApiError('查问失败!');          exit();        }    }     //导出根本信息表    public function exportbase(){        checkscret('secret');//验证受权码        checkdataPost('id');//ID         $id=$_POST['id'];         $map['id']=$id;         $data=M()->table('base')->where($map)->find();         if ($data) {            require_once "./vendor/autoload.php";            $tmp = new \PhpOffice\PhpWord\TemplateProcessor('./Public/template/temp_base.docx'); //关上模板            $tmp->setValue('dwmc', $data['dwmc']);            $tmp->setValue('dwdz', $data['dwdz']);            $tmp->setValue('dwlb', $data['dwlb']);            $tmp->setValue('dwxz', $data['dwxz']);            $tmp->setValue('zgzs', $data['zgzs']);             $tmp->setValue('xfaqzrr_xm', $data['xfaqzrr_xm']);            $tmp->setValue('xfaqzrr_zw', $data['xfaqzrr_zw']);            $tmp->setValue('xfaqzrr_dh', $data['xfaqzrr_dh']);             $tmp->setValue('xfaqglr_xm', $data['xfaqglr_xm']);            $tmp->setValue('xfaqglr_zw', $data['xfaqglr_zw']);            $tmp->setValue('xfaqglr_dh', $data['xfaqglr_dh']);             $tmp->setValue('zjzfhgb_xm', $data['zjzfhgb_xm']);            $tmp->setValue('zjzfhgb_zw', $data['zjzfhgb_zw']);            $tmp->setValue('zjzfhgb_dh', $data['zjzfhgb_dh']);             $tmp->setValue('jzcs', $data['jzcs']);            $tmp->setValue('jzgd', $data['jzgd']);            $tmp->setValue('zjzmj', $data['zjzmj']);            $tmp->setValue('mcjzmj', $data['mcjzmj']);            $tmp->setValue('kysj', $data['kysj']);            $tmp->setValue('szcs', $data['szcs']);            $tmp->setValue('yymj', $data['yymj']);            $tmp->setValue('jcsj', $data['jcsj']);            $tmp->setValue('trsysj', $data['trsysj']);            $tmp->setValue('zlfwhzxm', $data['zlfwhzxm']);            $tmp->setValue('scjyzk', $data['scjyzk']);            $tmp->setValue('lssq', $data['lssq']);            $tmp->setValue('ssyjfl', $data['ssyjfl']);            $tmp->setValue('xfsszljsl', $data['xfsszljsl']);            $tmp->setValue('jcqkdj_1', $data['jcqkdj_1']);            $tmp->setValue('jcqkdj_2', $data['jcqkdj_2']);            $tmp->setValue('jcqkdj_3', $data['jcqkdj_3']);            $tmp->setValue('jcqkdj_4', $data['jcqkdj_4']);             $tmp->setValue('dwlb_qt', $data['dwlb_qt']);                      $tmp->saveAs('./Uploads/九小场合根本状况治理登记表_'.$data['dwmc'].'.docx');            returnApiSuccess('导出胜利','http://xiaofang.*********.cn/Uploads/九小场合根本状况治理登记表_'.$data['dwmc'].'.docx');        }        else{            returnApiError('导出失败,请稍后再试!');              exit();        }    }     //消防安全综合治理注销    public function addxfaqzljl(){        checkscret('secret');//验证受权码        checkdataPost('userid');        checkdataPost('partid');                //对应字段        $dwmc=$_POST['dwmc'];        $jcsj=$_POST['jcsj'];        $bjccsmc=$_POST['bjccsmc'];        $bjccsdz=$_POST['bjccsdz'];        $jyz=$_POST['jyz'];        $jyzlxfs=$_POST['jyzlxfs'];        $jzlx=$_POST['jzlx'];        $sfdjjc=$_POST['sfdjjc'];        $sfkf=$_POST['sfkf'];        $djcs=$_POST['djcs'];        $jclb=$_POST['jclb'];        $ltjzcl=$_POST['ltjzcl'];        $sfzr=$_POST['sfzr'];        $jzrs=$_POST['jzrs'];        $jzcs=$_POST['jzcs'];        $zsqysfyaqck=$_POST['zsqysfyaqck'];        $zsqysfytswc=$_POST['zsqysfytswc'];        $zrxs=$_POST['zrxs'];        $hzzdbjxt=$_POST['hzzdbjxt'];        $zdpsmhxt=$_POST['zdpsmhxt'];        $snxfs=$_POST['snxfs'];        $mhq=$_POST['mhq'];        $mhqsl=$_POST['mhqsl'];        $xfssqtqk=$_POST['xfssqtqk'];        $dqxlqk=$_POST['dqxlqk'];        $ddzxcsyqk=$_POST['ddzxcsyqk'];        $sfsymhgwjrqnsbd=$_POST['sfsymhgwjrqnsbd'];        $sfcfyrybwxp=$_POST['sfcfyrybwxp'];        $yrybwxpcfsyqk=$_POST['yrybwxpcfsyqk'];        $sfdqkzxfpx=$_POST['sfdqkzxfpx'];        $ydsh=$_POST['ydsh'];        $yhjzgqk=$_POST['yhjzgqk'];         $userid=$_POST['userid'];        $partid=$_POST['partid'];         $id=$_POST['id'];        $baseid=$_POST['baseid'];           //数据        $data['dwmc']=$dwmc;        $data['jcsj']=$jcsj;        $data['bjccsmc']=$bjccsmc;        $data['bjccsdz']=$bjccsdz;        $data['jyz']=$jyz;        $data['jyzlxfs']=$jyzlxfs;        $data['jzlx']=$jzlx;        $data['sfdjjc']=$sfdjjc;        $data['sfkf']=$sfkf;        $data['djcs']=$djcs;        $data['jclb']=$jclb;        $data['ltjzcl']=$ltjzcl;        $data['sfzr']=$sfzr;        $data['jzrs']=$jzrs;        $data['jzcs']=$jzcs;        $data['zsqysfyaqck']=$zsqysfyaqck;        $data['zsqysfytswc']=$zsqysfytswc;        $data['zrxs']=$zrxs;        $data['hzzdbjxt']=$hzzdbjxt;        $data['zdpsmhxt']=$zdpsmhxt;        $data['snxfs']=$snxfs;        $data['mhq']=$mhq;        $data['mhqsl']=$mhqsl;        $data['xfssqtqk']=$xfssqtqk;        $data['dqxlqk']=$dqxlqk;        $data['ddzxcsyqk']=$ddzxcsyqk;        $data['sfsymhgwjrqnsbd']=$sfsymhgwjrqnsbd;        $data['sfcfyrybwxp']=$sfcfyrybwxp;        $data['yrybwxpcfsyqk']=$yrybwxpcfsyqk;        $data['sfdqkzxfpx']=$sfdqkzxfpx;        $data['ydsh']=$ydsh;        $data['yhjzgqk']=$yhjzgqk;         $data['baseid']=$baseid;         $data['userid']=$userid;        $data['partid']=$partid;        $data['create_time']=time();         //保留文件        $upload = new \Think\Upload(); // 实例化上传类        $upload->rootPath = './Uploads/'; // 设置附件上传根目录        $upload->saveName = array('uniqid', mt_rand(1,999999).'_'.md5(uniqid())); // 自定义图片重命名        $upload->exts = array('jpg', 'jpeg' ,'png'); // 设置附件上传类型 只容许照片        // 上传文件        $uploadinfo = $upload->upload();         if($uploadinfo){            if($uploadinfo['file1']['savepath'] && $uploadinfo['file1']['savename']){                $data['signature_check']="/Uploads/".$uploadinfo['file1']['savepath'].$uploadinfo['file1']['savename'];            }            if($uploadinfo['file2']['savepath'] && $uploadinfo['file2']['savename']){                $data['signature_bcheck']="/Uploads/".$uploadinfo['file2']['savepath'].$uploadinfo['file2']['savename'];            }        }                if($id){            $map['id']=$id;              //插入数据            $releaseInfo=M()->table('zhzljl')->where($map)->save($data);        }        else{              //插入数据            $releaseInfo=M()->table('zhzljl')->data($data)->add();        }          if($releaseInfo){          returnApiSuccess('注销胜利',$releaseInfo);        }        else{          returnApiError( '注销失败,请稍后再试');          exit();        }    }     //查问综合查看记录    public function queryxfaqzljlyid(){        checkscret('secret');//验证受权码        checkdataPost('baseid');         $baseid=$_POST['baseid'];         $map['baseid']=$baseid;         $releaseInfo=M()->table('zhzljl')->where($map)->find();         if($releaseInfo){          returnApiSuccess('查问胜利',$releaseInfo);        }        else{          returnApiError( '查问失败,请稍后再试');          exit();        }    }     //导出    public function exportxfaqzljl(){        checkscret('secret');//验证受权码        checkdataPost('id');//ID         $id=$_POST['id'];         $map['id']=$id;         $data=M()->table('xf_zhzljl')->where($map)->find();         if ($data) {            require_once "./vendor/autoload.php";            $tmp = new \PhpOffice\PhpWord\TemplateProcessor('./Public/template/temp_zljl.docx'); //关上模板            $tmp->setValue('dwmc', $data['dwmc']);            $tmp->setValue('jcsj', $data['jcsj']);            $tmp->setValue('bjccsmc', $data['bjccsmc']);            $tmp->setValue('bjccsdz', $data['bjccsdz']);            $tmp->setValue('jyz', $data['jyz']);            $tmp->setValue('jyzlxfs', $data['jyzlxfs']);            $tmp->setValue('jzlx', $data['jzlx']);            $tmp->setValue('sfdjjc', $data['sfdjjc']);            $tmp->setValue('djcs', $data['djcs']);            $tmp->setValue('sfkf', $data['sfkf']);            $tmp->setValue('jclb', $data['jclb']);            $tmp->setValue('ltjzcl', $data['ltjzcl']);            $tmp->setValue('sfzr', $data['sfzr']);            $tmp->setValue('jzrs', $data['jzrs']);            $tmp->setValue('jzcs', $data['jzcs']);            $tmp->setValue('zsqysfyaqck', $data['zsqysfyaqck']);            $tmp->setValue('zsqysfytswc', $data['zsqysfytswc']);            $tmp->setValue('zrxs', $data['zrxs']);             $tmp->setValue('hzzdbjxt', $data['hzzdbjxt']);            $tmp->setValue('zdpsmhxt', $data['zdpsmhxt']);            $tmp->setValue('snxfs', $data['snxfs']);            $tmp->setValue('mhq', $data['mhq']);            $tmp->setValue('mhqsl', $data['mhqsl']);            $tmp->setValue('xfssqtqk', $data['xfssqtqk']);             $tmp->setValue('dqxlqk', $data['dqxlqk']);            $tmp->setValue('ddzxcsyqk ', $data['ddzxcsyqk']);            $tmp->setValue('sfsymhgwjrqnsbd', $data['sfsymhgwjrqnsbd']);            $tmp->setValue('sfcfyrybwp', $data['sfcfyrybwxp']);            $tmp->setValue('yrybwxpcfsyqk', $data['yrybwxpcfsyqk']);            $tmp->setValue('sfdqkzxfpx', $data['sfdqkzxfpx']);            $tmp->setValue('ydsh', $data['ydsh']);            $tmp->setValue('yhjzgqk', $data['yhjzgqk']);             $tmp->setImageValue('signature_check', ['path' => '.'.$data['signature_check'], 'width' => 120, 'height' => 20]);            $tmp->setImageValue('signature_bcheck', ['path' => '.'.$data['signature_bcheck'], 'width' => 120, 'height' => 20]);             $tmp->saveAs('./Uploads/合用场合消防安全综合治理记录表_'.$data['bjccsmc'].'.docx');            returnApiSuccess('导出胜利','http://xiaofang.********.cn/Uploads/合用场合消防安全综合治理记录表_'.$data['bjccsmc'].'.docx');                }        else{            returnApiError('导出失败,请稍后再试!');              exit();        }    }     //增加根本信息照片    public function addbasepicbyid(){        checkscret('secret');//验证受权码        checkdataPost('baseid');        checkdataPost('type');         $baseid=$_POST['baseid'];        $type=$_POST['type'];         $map['baseid']=$baseid;         $data['baseid']=$baseid;         //保留文件        $upload = new \Think\Upload(); // 实例化上传类        $upload->rootPath = './Uploads/'; // 设置附件上传根目录        $upload->saveName = array('uniqid', mt_rand(1,999999).'_'.md5(uniqid())); // 自定义图片重命名        $upload->exts = array('jpg', 'jpeg' ,'png'); // 设置附件上传类型 只容许照片        // 上传文件        $uploadinfo = $upload->upload();         if($uploadinfo){            if($type=='01'){                $data['mt']="/Uploads/".$uploadinfo['file']['savepath'].$uploadinfo['file']['savename'];            }            else if($type=='02'){                $data['yyzz']="/Uploads/".$uploadinfo['file']['savepath'].$uploadinfo['file']['savename'];            }            else if($type=='03'){                $data['dlqk']="/Uploads/".$uploadinfo['file']['savepath'].$uploadinfo['file']['savename'];            }            else if($type=='04'){                $data['sfz']="/Uploads/".$uploadinfo['file']['savepath'].$uploadinfo['file']['savename'];            }        }        $data['create_time']=time();         if($this->checkbasepic($baseid)){            $releaseInfo=M()->table('basepic')->where($map)->save($data);        }        else{             $releaseInfo=M()->table('basepic')->data($data)->add();        }                  if($releaseInfo){          returnApiSuccess('增加胜利',"http://xiaofang.******.cn/Uploads/".$uploadinfo['file']['savepath'].$uploadinfo['file']['savename']);        }        else{          returnApiError('增加失败!');          exit();        }    }     function checkbasepic($baseid){        $map['baseid']=$baseid;         $ret=M()->table('basepic')->where($map)->find();         if($ret){            return true;        }        else{            return false;        }    }}