注:你现在看到的写于2022-12-08,有效期不确定。毕竟你不知道浙里办侧还会搞出什么花样来。

自己看吧,不用逐行读下去,按需跳转

  • 你们能看到这篇乐色的原因
  • 主要流程
    • 应用编目(开发灾难的开始)
    • 组件申请(给灾难加把火)
    • 创建应用(黑话学习)
    • 开发、压缩上传(火烧到一线码农了)
    • 上架前文档准备(黎明前的黑暗)
  • 踩坑点
    • 信息脱敏(无可厚非)
    • UI规范(优zi雅yi大wei方shi的审美规范)
    • 适老化对接(避不开的上架审核点)
    • 登录对接(漫长的折磨)
  • 其他(你完全预料不到,随机砸下来的天坑)
    • 应用活跃度考核
    • 应用组件调用考核
    • 应用工厂使用考核

你们能看到这篇乐色的原因

无非是因为浙里办开发组,乱七八糟的文档、乱七八糟的群、乱七八糟的规范、乱七八糟的坑。更有甚者CSDN上乱七八糟、火上浇油,让乱更乱的一些其它的乐色。
这里你不会找到他们的文档(那堆放在压缩包里面,或Word 、或PDF的东西),不会找到他们的一些链接(有的在政务网,有的在互联网,用来提交或下载前面那堆乐色的地址)。

主要流程

应用编目(开发灾难的开始)

  1. 网络要求:政务网
  2. 进入IRS平台:http://irs.zj.gov.cn/
  3. 身份验证:浙政钉用户
  4. 登录方式:浙政钉扫码
  5. 操作内容包括:
    1. 项目编目
    2. 应用编目
    3. 共享数据编目(最少5张表,每张表最少5个字段,需要逐字段填写,包括但不限于:数据来源单位、来源部门、表名、表中文名、字段名、字段类型、字段长度、字段注释(除ID外,不包含英文)、开放方式、更新频率等)

    一般情况下,需要填写3份复杂、冗长、难懂的表格。此处不再赘述、具体遇到不过是反复几轮的事情,伤害不高

组件申请(给灾难加把火)

  1. 网络环境:政务网
  2. 进入IRS平台:http://irs.zj.gov.cn/
  3. 在组件中搜索需要的组件
  4. 一般情况下,需要用到下列组件(这些组件也是传说中的强制组件的一部分,必须用1个)。
    1. 政务服务网个人用户单点登录(用于浙里办个人用户登录)
    2. 政务服务网法人用户单点登录(用户浙里办法人用户登录)
    3. 组织架构和用户体系(浙政钉)(用户浙政钉同步组织架构信息)
    4. “浙里办”统一单点登录(非强制组件,微信中登录不得不用)
    5. 电子地图(是的你没有看错,没有百度、高德、腾讯什么的,就是电子地图,部分网络下不能访问互联网,情有可原。但是只有瓦片数据,具体对接使用需要用OpenLayer或者Leaflet)

创建应用(黑话学习)

  1. 网络环境:政务网
  2. 进入IRS平台:http://irs.zj.gov.cn/
  3. 在应用列表右侧,找到应用发布,点击后选择发布浙里办应用,还是浙政钉应用。浙政钉应用又分PC、H5;浙里办应用又分:H5,浙江政务网。

    黑话小课堂:
    浙政钉H5: 浙政钉手机端打开页面
    浙里办H5: 浙里办(APP+支付宝+微信)手机端打开页面
    对应的其他端,请在合理范围内猜测

  4. 面对公众的必须上传浙里办应用、面对政府单位的必须使用浙政钉应用

    黑话小课堂:
    治理侧应用: 浙政钉应用
    服务侧应用: 浙里办应用

开发、压缩上传(火烧到一线码农了)

  1. 网络环境:互联网

  2. 进入开放商工作台:https://op-irs.zj.gov.cn/,注意:部分市可能有自己的发布平台

  3. 上传代码

    选择不包含node_modules的源代码,压缩成zip提交上传
    注意:

    1. 代码必须包含package.json
    2. 必须支持npm build
    3. 打包结果必须位于根目录下的build文件夹,并且build下存在可访问的index.html
  4. 等待编译
    白天高峰时期(一般下午3~5点),可能存在编译失败的情况,加班时间段编译速度有所改善。用VueReact的应用,并且有大量NPM包依赖的应用请自求多福。

  5. 反复调试
    部分问题在本地调试时可能不会发生,上传后在实际打开环境中存在异常,因此需要上传后反复修改上传编译测试

  6. 网络请求
    千万不要受到文档的误导,不是非使用mgop工具不可,只要互联网下可以正常访问的接口即可。不要浪费时间去逐个接口注册。

  7. 奇技淫巧
    针对非npm类型的打包项目,即传统前端,挨个JS文件引用的项目,我们可以使用node将项目相关静态文件拷贝到build文件夹下以达到相同的目的。因此,我们只需要在原前端项目下,加上2个文件即可。
    不是传统结构的项目,是不是可以先本地打包变成那啥?

    package.json

{"name": "project-name","version": "0.0.0","description": "","main": "index.js","scripts": {"build": "node index.js build","test": "echo \"Error: no test specified\" && exit 1"},"repository": {"type": "git","url": ""},"author": "","license": ""
}

index.js

// 当前代码存在改动,使用前请根据实际情况进行调整、测试
const path = require('path');
const fs = require('fs');function CombineBuildCSS(src, dst){// append css in min cssfs.readFile(src, (error, content) => {if(!!error)return console.error(error);if(fs.existsSync(dst))fs.appendFileSync(dst, content, {encoding: 'utf-8'});elsefs.writeFileSync(dst, content, {encoding: 'utf-8'});});
}function CopyFile(src, dst, callback){const dir = path.dirname(dst);if(!fs.existsSync(dir) || !fs.statSync(dir).isDirectory())fs.mkdirSync(dir, {recursive: true,});if(fs.existsSync(dst))fs.truncateSync(dst);fs.copyFile(src, dst, (err) => {if(!!err)return console.error(err);if(typeof callback === 'function')callback();});
}function CopyDir(src, dst){if(!fs.existsSync(dst))fs.mkdirSync(dst, {recursive: true});fs.readdir(src, (err, files) => {files.forEach(file => {const from = path.join(src, file);if(fs.statSync(from).isDirectory())CopyDir(from, path.join(dst, file));elseCopyFile(from, path.join(dst, file));});});
}function CreateBuildContent(){const dir = path.resolve('./build');if(!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()){fs.mkdirSync(dir, {recursive: true});}if(!fs.existsSync(dir)){throw Error('Cannot create the build dir');} else {(fs.rmSync || fs.rmdirSync)(dir, {recursive: true,force: true});fs.mkdirSync(dir, {recursive: true});}const files = ['./index.html','./styles','...'  // 其他需要拷贝的静态文件];const mapper = {'./index.htm': './index.html', // 文件映射};files.forEach((file) => {const src = path.join(file);const dst = path.join(dir, file in mapper ? mapper[file] : file);if(!fs.existsSync(src))return console.warn(file, 'not exists!');if(fs.statSync(src).isDirectory())CopyDir(src, dst);elseCopyFile(src, dst, () => {});});
}CreateBuildContent();

上架前文档准备(黎明前的黑暗)

  1. 准备好gov域名,因为浙政钉上架审核只接受该类域名
  2. 需要准备的文档:
序号 文档 说明
1 同源发布申请报告 填表,说明已经完成浙里办、支付宝浙里办小程序、微信浙里办小程序对接
2 上架运维材料提交 说明项目的网络架构、压测信息(TPS>=100,压测时长>=20min)
3 安全测试报告结果 说明已经进行安全测试,包括:端口开放、敏感信息存储、敏感信息展示、越权漏洞、XSS漏洞、SQL注入漏洞、跨站请求伪造漏洞、文件上传漏洞。需要包括测试记录、截图
4 适老化适配完成报告 填一张长长的表,逐项核对

踩坑点

信息脱敏(无可厚非)

信息 规则
人名 隐藏首字符,例如:张三->*三
手机号码 隐藏中间4位,例如:12200001111->122****1111
身份证强隐藏 保留首尾,例如:330105190001010001->3****************1
身份证普通隐藏 保留首尾、区县、年、月,例如:330105190001010001->3***05190001*****1
其他证件 保留前后1/3的内容,例如:000000000 -> 000***000
固定电话 保留区号、后4位,例如:057188888888 -> 0571****8888
邮箱 保留域名、前3个字符+3个***,例如:10000000@qq.com -> 100***@qq.comzz@163.com -> zz***@163.com
银行卡号 保留前6、后4,例如:6226000000000000 -> 622600******0000
其他 保留前后1/3的内容,例如:000000000 -> 000***000

UI规范(优zi雅yi大wei方shi的审美规范)

具体不在吐槽,主要应用ICON有以下几点需要注意:

  1. 图标颜色只能选择3中规范中的颜色;
  2. 图标内容区域尺寸,需要按规范尺寸来,具体有:
    1. 图标尺寸:36 * 36,倒角:2
    2. 内容:正圆:2424、正方形:2222、纵向矩形:2024、横向矩形:2420
    3. 外圆角,内直角
    4. 角标只能放置在右下角,且与主图标间隔1px
    5. 有交叉的部分,需要使用正片叠底
    6. 导出108*108px图标,且不超过12kb

适老化对接(避不开的上架审核点)

浙里办人性化的体现,虽然适老化后界面丑了,很多功能要被隐藏(所以到底算不算得上好呢)。

登录对接(漫长的折磨)

浙里办?不!是App+支付宝直扫+支付宝小程序+微信小程序

  1. 上传代码并编译成功后,需要点击提交发布
  2. 在应用列表中,可以看到PC地址(格式:https://mapi.zjzwfw.gov.cn/web/mgop/gov-open/zj/{APPID}/reserved/index.html)。

    APPID,请在应用列表中(第二列)查看。对下方地址进行替换
    正式地址:https://mapi.zjzwfw.gov.cn/web/mgop/gov-open/zj/{APPID}/reserved/index.html
    测试地址:https://mapi.zjzwfw.gov.cn/web/mgop/gov-open/zj/{APPID}/lastTest/index.html

  3. 加钉钉群(31376954),当前这个是二群,不知道当你们看到的时候,还能不能加;
  4. 在群里查看历史消息,按格式填写(包括:应用名称、正式地址、测试地址、政务服务网个人用户单点登录组件AK、SK)并@相关人员进行回调地址配置,然后等待1~3天左右;
  5. 浙里办、支付宝直扫、支付宝小程序:
    此处需要判断具体是APP还是支付宝中,确定具体重定向地址:
var uri= window.location.href;if(uri.indexOf('#') > -1)uri = uri.substr(0, uri.indexOf('#'));uri = encodeURIComponent(uri);var ua = window.navigator.userAgent.toLowerCase();
if(ua.indexOf('alipay') > -1)window.location.replace("https://puser.zjzwfw.gov.cn/sso/alipay.do?action=ssoLogin&scope=1&servicecode=您申请的组件对应的AK&redirectUrl=" + uri);
elsewindow.location.replace("https://puser.zjzwfw.gov.cn/sso/mobile.do?action=oauth&scope=1&servicecode=您申请的组件对应的AK&redirectUrl=" + uri);
此处获取到`ticket`的,使用`政务服务网个人用户单点登录`组件接口,获取用户信息处理登录流程
  1. 支付宝小程序、微信小程序:
    此处获取到ticket的,使用“浙里办”统一单点登录组件接口,获取用户信息处理登录流程
    测试时,你收到唯一的ticket,该ticket具有以debug_tk_开头的特征,用户信息也是虚拟信息。
    测试阶段,在支付宝小程序、微信小程序中打开应用时,会获得这个测试ticket,如需正常上架审核及调通功能,需要用到上述组件。
    使用政务服务网个人用户单点登录组件时,会提示st已过期的报错。
    又,如果先使用支付宝直扫,再使用支付宝浙里办小程序扫描,将获得正常ticket
    又又又,微信获取ticket不能使用重定向的方式。需要使用到ZWJSBridge。示例代码如下:
ZWJSBridge.ssoTicket({}).then(rs => {if(rs.result && !!rs.ticketId)return wxLogin(rs.ticketId);  // 具体实现ZWJSBridge.openLink({type: 'reload'}).then(rs => {wxLogin(rs.ticketId);  // 具体实现}).catch(err => {var uri= window.location.href;if(uri.indexOf('#') > -1)uri = uri.substr(0, uri.indexOf('#'));uri = encodeURIComponent(uri);window.location.replace("https://puser.zjzwfw.gov.cn/sso/mobile.do?action=oauth&scope=1&servicecode=您申请的组件对应的AK&redirectUrl=" + uri);});
});

登录对接 OVER T_T

其他(你完全预料不到,随机砸下来的天坑)

应用活跃度考核

如题。时不时来个考核,不用嘛,就扣分(当然,有的单位不在乎)。其实是业主单位,等等,业主怎么会有错呢?当然是应用不够人性化,不好用,开发的问题嘛。
话说回来,浙里办这么难用的东西,体验你还想怎么样。

应用组件调用考核

如题。组件你想先申请了,但等用到直接对接?
不行!
你放着不用,组件会有考核,考核嘛,还是扣分(有的单位还是不在乎的)。

应用工厂使用考核

看到这里,就要先问一下,你要对接的是杭州应用工厂,还是浙江省应用工厂?
没想到吧,有2个,如果你运气足够好,你在对接一遍杭州应用工厂,并完成一次考核要求之后,你还会遭遇了省应用工厂的洗礼(所以杭州的应用工厂是不是白搞了?)。

项目 杭州 省工厂
网络 政务网 政务网
前端 支持npm/yarn打包 支持npm/yarn打包
Java后端 支持Maven打包 支持Maven打包
非Java后端 代码上传 代码上传
部署 Docker 下载打包成果
代码审计
安全审计
审计速度 超级慢
代码管理工具 git git
GIT身份认证 SSH SSH

【浙里办】浙里办开发上架指南北西东,指乱七八糟。避坑手册Cookbook相关推荐

  1. 新人小白如何选择编程语言和开发方向(非常详细)初学者避坑指南!!

    如果你听说IT编程很赚钱,想入坑,不想入行,那你可以来看一看这篇文章!! 有些坑你应该没入之前就就应该知道! 全世界的编程语言有 600 多种,TIOBE 统计的有 100 种,参与排名的有 50 种 ...

  2. 【鸿蒙开发】hpm-cli的安装避坑、详细使用教程

    [鸿蒙开发]hpm-cli的介绍.安装避坑.详细使用教程 文章目录 [鸿蒙开发]hpm-cli的介绍.安装避坑.详细使用教程 安装环境准备 使用教程 踩坑集合 HPM包管理器是华为鸿蒙推出的Harmo ...

  3. 浙里办H5微应用开发流程

    一.代码开发 1.   源代码准备: 由于源代码需要能够部署到政务中台,即要支持npm run build构建源码.(解释:把源代码上传政务中台后,它会后台自动编译构建项目并取build文件夹下的产物 ...

  4. 浙政钉h5微应用开发vue

    浙政钉h5开发简单总结 1.在页面引入专有钉钉 JSAPI npm install --save gdt-jsapi import dd from 'gdt-jsapi'; /在使用页面导入 Vue. ...

  5. 2018年图灵奖--约书亚·本吉奥、杰弗里·埃弗里斯特·辛顿和Yann LeCun简介

    大家好,我是执念斩长河.今天讲述的是2018年图灵奖获得者约书亚·本吉奥(Yoshua Bengio).杰弗里·埃弗里斯特·辛顿(Geoffrey Hinton)和Yann LeCun.图灵奖奖励他们 ...

  6. Linux文本复制到记事本文本文件乱码,解决“在windows里的记事本里编辑的汉字文本文件,上传到linux服务器上出现乱码“问题...

    一.前期准备 1.首先在windows环境下打开记事本,然后创建一个包含汉字和英文的文本文件,输入内容"测试在windows里的记事本里编辑的文本文 件,上传到linux服务器上会不会出现乱 ...

  7. word里如何在□里打√!框框里打勾!!!!!

    word里如何在□里打√!框框里打勾!! 快捷便捷的方式 1.按住键盘上的[Alt]键不放,然后在小键盘区输入[9745]这几个数字,最后松开 ALT 键,自动变成框框中带勾符号: 2.在Word文档 ...

  8. WORD: 如何在一个word里文档里创建多个目录?

    如何在一个word里文档里创建多个目录? 1 目录的创建 引用/目标/自动目录  (同时文章本身需要设置层级标题正文等) 一般不选手动目录,没试过狠麻烦吧 2 如何设置2个目录呢? 直接在新的地方插入 ...

  9. Python-读取文件夹里Excel文件里的数据

    场景描述 已知:文件夹路径.Excel文件名.存放数据的Sheet名 目标:读取目标文件夹里目标Excel里面目标Sheet里的数据 思路 方法一:利用Pandas模块 import pandas a ...

最新文章

  1. oracle中set怎么用,sqlplus命令格式以及sqlplus中set的用法与解释-Oracle
  2. Mac写文件到U盘的方法
  3. LeetCode-Reverse Integer
  4. HALCON表面划痕检测
  5. 跟小静读CLR via C#(05)- 访问限定、数据成员
  6. 聚焦2020年财报:进击的恒大汽车,“变态”的智能汽车
  7. c语言函数用指针传递参数问题
  8. wxWidgets:wxDatePickerCtrl类用法
  9. 这个回答让我错失offer!成功收获美团,小米安卓offer
  10. Linux中报库或者程序找不到的解决方法
  11. haproxy 配置 说明
  12. 纺织名词术语(针织品部分)---疵点
  13. 21天学通python-21天学通Python PDF 高清版
  14. 正式开通我的开源博客
  15. 5月17日 AJAX之JSON
  16. WebSocket消息推送(实现进行聊天)和WebSocket简介
  17. Windows的文件目录管理策略
  18. 锁存器芯片74HC573芯片的用法,及其在实际电路中的应用
  19. 计算机桌面操作系统版本,如何看电脑操作系统版本
  20. 网页微信公众平台登录电脑版

热门文章

  1. [合集]阿甘正传部分台词中英对照
  2. 技术之路,漫漫而修远
  3. 华硕梅林固件成功安装astrill后,点进去一片空白
  4. 期货开户保证金能极端行情保安全
  5. 百度网盘官方推出的“下载提速”方法 — 免会员
  6. 豌豆荚如何避开移动互联入口争夺锋芒?
  7. oracle查询数据库名、实例名等
  8. java奥特曼对战小怪兽_JAVA程序设计(09)-----面对对象设计初级应用 奥特曼打小怪兽...
  9. C++ 库函数<string>示例
  10. pythonarray什么意思_python:array([...])是什么意思?(python: what does array([…]) mean?)...