这几天开始啃单位的OA平台数据库,那玩意是上级的上级找集成商开发的,把它当宝贝,连个接口都不提供,不过数据库安装在内网中,要研究数据库结构,把人员和单位数据导出来到会议系统中,这样方便把人员和终端进行绑定,涉及到内部OA的事情,就不会写在这里啦,泄密可不好玩的。

安卓客户端到这里基本没什么好改的了,大不了再加个自动更新功能,那在没开发经费的情况下,估计是不可能实现的了,就这样打包发布吧。

理论上在安卓项目里面是可以找到打包好的apk文件的,在项目的app->build->outputs->apk里面有个app-debug.apk,这个就是最后一次调试运行生成的apk文件,但注意,这个文件是未签名的,在终端安装可能会给安全管家这类的软件限制安装的。

所以要打包签名,这样生成最终的apk才能发布。

在Android Studio的“Build”菜单中选择“Generate Sinned APK...”,就会打开打包向导了。

怎么将服务器打包成镜像可供下载 服务器打包apk_怎么将服务器打包成镜像可供下载

如果曾经创建过签名文件,选择签名文件填写密码就可以Next了,但没有,创建一个新的!

怎么将服务器打包成镜像可供下载 服务器打包apk_签名文件_02

挑几个重要的讲讲,其实可以随便填的。

Key store path  签名文件保存文件夹和文件名,最右边的按钮可以打开创建。

Password 签名文件密码,要记住,如果以后重新打包需要用到这个签名文件要输入密码的

Confirem 重复上面的密码,确保密码没错误校验使用

下面是key文件保存的内容

Alias 别名

Validity key文件的有效期

Certificate 里面的内容一看就明白,乱填一番就可以,不填好像没事。

填完就OK,等着创建签名文件,创建完毕后会自动返回并填写完向导的内容,然后Next

怎么将服务器打包成镜像可供下载 服务器打包apk_怎么将服务器打包成镜像可供下载_03

在APK Destination Folder最后那个按钮那里选择一个文件夹,用来保存生成的APK文件,Finish就可以在刚才指定的文件夹里面生成最终的单一打包APK文件啦,也就是安卓的安装程序,把这个APK文件拷贝到别的安卓平板或手机就可以安装了。当然,也可以拷贝到会议系统的IIS目录里面,让用户自行下载安装,我是出名懒的,拷贝到服务器去,在服务器那里设置一下让用户使用终端的浏览器登录系统,检测是不是自己编写的app里面的webview打开的,如果不是,跳转到下载页面去,让用户自己下载安装。

APP的打包发布就讲到这里,下面讲讲机器码在服务端的应用处理。

上篇博文讲到,机器码是MD5加密后通过QueryString参数传递到服务器的,接下来就很简单啦。在default.aspx.cs里面的Page_Load弄几句代码就可以实现不同功能了。

if (Request.QueryString["code"] == null && Session["code"]==null)
                Response.Redirect("download.aspx");

检测code参数和Session,如果都没有,表示是用别的浏览器登录,跳转到下载页面,下载页面就不多说了,就链接到apk文件而已,专业点的就点提示说明,弄个下载按钮。

好,在数据库里面弄个新表,保存终端信息,设一个字段,用来保存终端状态,和会议状态一样,使用数字来表达不同的状态,自己定义规则,假设我定义1位终端注册但管理员未批准,0表示终端不存在。

先在MeetingOP里面新建一个类,public class TerminalOP,在类里面添加一个获取终端状态的函数

public static int GetState(string code)//检查终端机器码在数据库中是否存在
        {
            DataTable DT = DataOP.GetDataTable("select mState from MeetingTerminal where mCode='" + code+"'");
            if (DT.Rows.Count > 0)
                return Convert.ToInt32(DT.Rows[0]["mState"].ToString());
            else
                return 0;
        }

回到Default.aspx,在Page_Load里面对QueryString["code"]进行处理

string sCode = Request.QueryString["code"].Trim().ToUpper();
            Session["code"] = sCode;
            int iState = MeetingOP.TerminalOP.GetState(sCode);
            if (iState == 0)
                Response.Redirect("Registration.aspx");
            if(iState == 4)
                Response.Redirect("Result.aspx?ID=2");
            ClientScript.RegisterStartupScript(this.GetType(), "Pop", "<script>SetDiv('" + iState .ToString()+ "');</script>");

定义个变量把Request.QueryString["code"]保存起来,去掉前后空格,并把所有字符全部转成大写,因为安卓那边传递过来的是小写的。

搞过个Session把机器码保存起来,方便签名什么的应用。

看机器码在数据库的状态,0表示这个机器码没有在数据库中存在,跳转到注册页面,4表示这个机器码因为别的原因被管理员注销了,跳转到出错页面Result.aspx?ID=2,这个页面是专门用来显示系统错误的,ID=2就是表示机器码被管理员注销,这个页面就不多说,自定义的一个东西,喜欢怎么玩都可以。

ClientScript.RegisterStartupScript(this.GetType(), "Pop", "<script>SetDiv('" + iState .ToString()+ "');</script>");这句很关键,页面显示后注册一个script体,并执行预先定义好的JS函数,这里这个函数没干什么好事情的,就是如果机器码的状态是1,就不显示会议列表了,改显示提示信息,因为前面都跳转飞掉了,只剩状态2和状态3了,状态2是设定终端为机动终端,不绑定用户,状态3设定是终端绑定用户的。

SetDIV(State)的JS函数,这个函数我懒得写在JS文件里面,就直接写在页面里面了。

<script type="text/javascript">
        function SetDiv(State) {
            if (State == 1)
                document.getElementById("MeetingIT").style.display = "none";
            else
                document.getElementById("Wait").style.display = "none";
        }
    </script>

可以看到,就是操作两个不同的层显示,状态1就把会议列表那个层给关掉,其余的就把提示层给关掉

<div id="Wait" class="info">
        <p style="text-align:left;text-indent:2em;">你的终端已经注册成功,等待管理员审批。</p>
        <p style="text-align:left;text-indent:2em;">请稍后刷新页面查看。</p>
    </div>

这是提示层,其样式是用类的,设计专门用来搞提示信息的。


.info
{
    position:absolute;
    width:96%;  
    left:2%;
    right:2%;  
    top:3.5em;  
	padding:0px;  
    height:auto;
    display:block;
    border: 1px solid #999;
    -webkit-border-radius: 5px;
    -webkit-box-shadow: 2px 2px 10px #909090;
    background:#dddddd;
    }

至于机器码注册那个页面就很简单了,不写代码了,简单讲讲设计思路,自己去实现吧。

页面拖一个输入框,让用户填写OA系统的用户名,去用户数据库中查看有没有这个用户,如果有再查看有没有绑定终端(单位规则限制,每用只能绑定一个终端),如果都没有,就把终端记录在数据库中,把终端状态设为1,让管理员审核。用户表和终端表连个数据库中表有很多是互相关联的,编写管理工具的时候要注意两个表的数据同步。由于我还要研究把OA系统的用户数据导出来,这部分的代码暂不提供。