精华内容
下载资源
问答
  • 将python程序注册成windows后台服务

    千次阅读 2019-09-07 11:01:42
    需求:将python定时任务放到后台一直运行 ...于是使用了srvany.exe,instsrv.exe来注册服务。 1)安装pyinstaller pip install pyinstaller 2)使用pyinstaller将程序打包成exe可执行文件。 pyinstaller -c ...

    需求:将python定时任务放到后台一直运行

    之前使用的是pywin32模块,将程序安装之后却无法启动,error:服务没有及时响应启动或控制请求

    于是使用了srvany.exe,instsrv.exe来注册服务。

    1)安装pyinstaller

    pip install pyinstaller

    2)使用pyinstaller将程序打包成exe可执行文件。

    pyinstaller -c -F 需要打包的py文件

    3)从网上下载srvany.exe,instsrv.exe,放到一个文件夹中

    4)按win+R键打开运行,输入cmd,点击确定进去命令提示符之后,在保存有instsrv.exe的目录输入类似如下命令

    instsrv ServiceName ~\srvany.exe ,其中ServiceName是服务名,~\srvany.exe为srvany.exe所在地址的绝对路径。

    如果提示没有权限,可以用管理员身份打开cmd。

    5)按win+R键打开运行,输入regedit,点击确定,进入注册表编辑器,依次点击HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName

    6)在ServiceName中新建Parameters项,然后在Parameters项中新建几个字符串值,其中Application为exe程序所在的路径地址, AppDirectory为exe程序所在的文件夹路径,AppParameters 为服务运行的程序启动需要的参数 

    7)注册表设置好之后,我们就将exe程序注册成服务了,按win+R打开运行,输入services.msc,点击确定,进去之后,可以看到注册的ServiceName的服务,进行启动就可以启动exe程序了

    展开全文
  • 注册服务一般是有两种方式: 在usr/lib/systemd/system下新建 服务名.service ,编辑脚本 在etc/init.d下新建服务,编辑脚本 这两种方式在我其他的文章中都有提到过,今年主要分析一下第二种方式的原理 能够...

    注册成服务一般是有两种方式:

    • 在usr/lib/systemd/system下新建 服务名.service  ,编辑脚本
    • 在etc/init.d下新建服务,编辑脚本

     这两种方式在我其他的文章中都有提到过,今年主要分析一下第二种方式的原理

     

    能够使用service命令进行操作的,就是已经注册成为linux的系统服务了。window中也可以注册成为系统服务的办法。

    service命令用的次数真不少,就是比较多的关联点,用了很多次了,还是有些地方没打通,云里雾里的。所以才梳理一下这个技术知识点,理顺思路。此时我觉得,很有必要理解service命令的原理性知识了。

    了解service命令的来龙去脉,在解决实际问题中的帮助,结合实际应用,我对以下问题有帮助:

    1、如果从网上下载一个新的软件,安装到linux上面去。想注册成系统服务,我需要自己编写一个shell脚本文件才行。这个脚本文件如何编写呢?如果不了解servcie命令的机制。会漏掉一些东西了。比如我之前下载的sphinx安装到服务器后。我想使用"service sphinx start"这样的简短命令来管理,就必须注册成为系统服务。而源码包中是没有提供写好的脚本的。必须自己写一个。

    知道了来龙去脉,可以减少依赖。像niginx、mysql我们都可以自己编写供servcie调用的脚本文件。

    2、使用chkconfig的先决条件。如果要进一步使用"chkconfig --level 3456 sphinx"来自由控制开启和关闭,那么前提必须实现有供调用的脚本文件(也就是这个服务要是系统服务可以让service调用)

    以"为什么要注册成为service服务"的角度来理解,这样做的好处是什么,从这里展开来理解。

    把一个程序(比如mysql、apache等)注册成系统服务的好处,通俗点理解我觉得包括两个方面:

    1、可以使用"service 服务名称"来进行管理,比如常常使用的命令”service httpd start”,就是httpd注册成为一个服务了,于是才不需要写一大串的原始服务路径。

    像sphinx的启动手工方式为:”/data/installsoft/sphinx-for-chinese/bin/searchd –c 配置文件”

    将sphinx注册成为系统服务后,就可以像"service sphinx start"来启动。

    注:sphinx是一个全文搜索服务。为方便理解,可以换成是mysql、apache也行。

    把”service sphinx”看成等价于"/data/installsoft/sphinx-for-chinese/bin/searchd"也可以。

     

    关联要点

     

    要把一个程序注册成系统服务,首先得给出一个供service命令调用的脚本文件放到目录"/etc/rc.d/init.d/"中去。

     

    /etc/rc.d/init.d/这个目录下其实就是很多脚本文件。看下面的截图,就是我服务器上列出的文件(其实都是一些shell脚本文件)

     

    现在疑问:这个脚本文件是一个shell文件,假设要自己编写这个脚本,里面要编写什么样的内容呢?

    联想一下常常使用的命令:service httpd start、service httpd stop。

     

    注册成系统服务是方便类似上面这样子调用。那么编写的shell脚本只要处理接受start参数应该干嘛,接收stop参数应该干嘛。

     

    实际上,脚本的内容是完全可以按照自己需要来编写。比如我在管理sphinx的时候。我需要重建索引,直接传递一个reindex参数就可以重建:”service sphinx reindex”。

     

    通俗点的理解方式

    我习惯于将”service httpd start” 将httpd理解成目录/etc/rc.d/init.d/下的脚本文件httpd(脚本文件与服务名称是同名的),所以service httpd就是去调用/etc/rc.d/init.d/下的脚本文件httpd。

    而后面接着的start,则是向/etc/rc.d/init.d/httpd传递一个start参数。归纳一下如下:

    service httpd 等价 /etc/rc.d/init.d/httpd

    service httpd start 等价 /etc/rc.d/init.d/httpd  start

    service httpd stop 等价 /etc/rc.d/init.d/httpd  stop

     

     

    注:httpd是一个shell脚本

     

    具体接到这个start参数该如何处理,你爱干嘛就干嘛,你完全可以停掉服务,也可以启动服务。只是按照我们习惯,都是启动服务。

    我一般理解”service httpd start “ 命令执行的时候,会去目录”/etc/rc.d/init.d/”目录下寻找一个httpd的脚本文件。有同名文件,就表示服务存在,没有会提示服务不存在。可以试一下使用一个文件名不存在的服务:service jgj start,看看会提示什么信息。

     

     

    其实就是jgj这个文件不存在。在这个目录里面创建一个jgj文件,就不会告诉你,服务不存在。所以服务存在的条件是同名文件存在,哈哈。

     

     

    这个时候不会提示服务不存在,是没有执行权限

    增加一下执行权限,chmod +x jgj

    这个时候会执行jgj脚本文件里面的命令,里面是什么就执行什么,语法错了就报错。

     

     

    具体例子:sphinx注册成系统服务

    原来我启动sphinx服务的命令为 “/data/install/sphinx-for-chinese/bin/searchd –c  /data/install/sphinx-for-chinese/ect/shpinx.conf”

    重建sphinx中的索引的命令为 “/data/install/sphinx-for-chinese/bin/indexer –c –c  /data/install/sphinx-for-chinese/ect/shpinx.conf  --all --rotate”

    实在太长了,其他不用管是干嘛的,只需要知道–c表示配置文件位置,它后面的值为” /data/install/sphinx-for-chinese/ect/shpinx.conf”

    如果我每次都需要这样子来操作,敲命令确实繁琐了。把sphinx加到系统服务中去。

    可以使用”service sphinx start”、”service sphinx reindex”很简短的命令来替代上面一大串。

    大体意思是,把上面一大串启动的命令和重建索引的命令都放到了/etc/rc.d/init.d/sphinx这个脚本文件中去了(为了通俗点才这么说,当然不是简单复制进去就可以,还要接收start、reindex这些参数)

    下面是我用在服务器上名sphinx脚本文件(/etc/rc.d/init.d/sphinx)

     

    # !/bin/bash

    # chkconfig:  - 85 15  

    # description: sphinx-for-chinese  service

    #processname:sphinx

     

    ROOT_PATH=/data/installsoft/sphinx-for-chinese

     

    case "$1" in

    start)

    echo "Starging sphinx Server..."

    $ROOT_PATH/bin/searchd  -c $ROOT_PATH/etc/sphinx.conf

    ;;

    stop)

    echo "Stopping sphinx Server..."

    $ROOT_PATH/bin/searchd  --stop

    ;;

    restart)

    $ROOT_PATH/bin/searchd  --stop

     

    $ROOT_PATH/bin/searchd  -c $ROOT_PATH/etc/sphinx.conf

     

    ;;

     

    reindex)

    echo "reindexing..."

    $ROOT_PATH/bin/indexer -c $ROOT_PATH/etc/sphinx.conf --all --rotate

     

    ;;

     

    *)

    echo "Usage: $0 {start|stop|restart|reindex}"

    exit 1

    ;;

     

    esac

     

    exit 0

     

    解释:上面用了case语法。可以看到接收start参数进来的时候,执行的是:$ROOT_PATH/bin/searchd  -c $ROOT_PATH/etc/sphinx.conf

     以后我还需要增加一些 操作项,比如servcie sphinx kill,那么在脚本中继续添加一段接收kill参数的处理代码即可了。写到这里,我更加理解注册成为系统服务管理上的方便之处。

    2、注册成系统服务,还有一个好处。可以使用chkconfig命令来控制运行级别。也就是控制什么级别下面是开启还是运行。

    chkconfig –level sphinx 3456

    这个命令是设置在3、4、5、6运行级别下sphinx服务(也就是/etc/rc.d/init.d/sphinx这个脚本)是启动状态。

    我以前就比较纳闷,既然都是使用到/etc/rc.d/init.d/下的脚本文件。这个脚本文件内容完全是自己编写的,里面内容不一定有启动命令啊。如何使得chkconfig就可以开机启动服务了呢?

    每个启动级别在/etc/rc.d/下是有一个单独的目录:rc0.d、rc1.d………rc6.d

    直到从某个资料中下面介绍:

    S开始的文件向脚本传递start参数

    K开始的文件向脚本传递stop参数

    看到上面的话,顿时理解了。原来,向/etc/rc.d/init.d/sphinx传递start和stop参数来实现了。一句话:chkconfig配置的S85sphinx这些文件实际上就是传递一个参数给脚本文件/ect/rc.d/init.d/sphinx。这样很通俗的明白了。chkconfig来开机启动机制了,在开机的时候,传递参数给脚本文件。

     

     

    那么现在明白,自己编写的服务脚本,也必须实现接受start和stop两个参数的处理才行。

     

    service与chkconfig的关系归纳为:

    先要注册成为系统服务(即service可以调用),然后才能使用chkconfig控制运行级别。

    service是chkconfig的前提条件。

    展开全文
  • C++创建Windows后台服务程序

    万次阅读 多人点赞 2018-08-24 11:37:58
    服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程序包含下面三个函数: 服务程序主函数(main):调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制...

    前言

    后台服务 程序是在后台悄悄运行的。我们通过将自己的程序登记为服务,可以使自己的程序不出现在任务管理器中,并且随系统启动而最先运行,随系统关闭而最后停止。

    服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程序包含下面三个函数:

    • 服务程序主函数(main):调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制管理程序。
    • 服务入口点函数(ServiceMain):执行服务初始化任务,同时执行多个服务的服务进程有多个服务入口函数。
    • 控制服务处理程序函数(Handler):在服务程序收到控制请求时由控制分发线程引用。

    编写服务程序

    1、服务程序主函数

    #include <iostream>
    #include "Windows.h"
    
    #define SERVICE_NAME "srv_demo"
    SERVICE_STATUS ServiceStatus;
    SERVICE_STATUS_HANDLE hServiceStatusHandle;
    
    int main (int argc, const char *argv[])
    {
        SERVICE_TABLE_ENTRY ServiceTable[2];
    
        ServiceTable[0].lpServiceName = SERVICE_NAME;
        ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;
    
        ServiceTable[1].lpServiceName = NULL;
        ServiceTable[1].lpServiceProc = NULL;
        // 启动服务的控制分派机线程
        StartServiceCtrlDispatcher(ServiceTable); 
        return 0;
    }

    首先声明几个全局变量,以便在程序的多个函数之间共享它们值。之后在主函数中创建一个分派表。分派表是SERVICE_TABLE_ENTRY 类型结构,它有两个域:

    • lpServiceName: 指向表示服务名称字符串的指针;当定义了多个服务时,那么这个域必须指定
    • lpServiceProc: 指向服务主函数的指针(服务入口点)

      一个程序可能包含若干个服务。每一个服务都必须列于分派表中,分派表的最后一项的两个域都必须为 NULL 指针。并且在只有一个服务的情况下,服务名是可选的。

    StartServiceCtrlDispatcher函数启动服务的控制分派机线程,当分派表中所有的服务执行完之后(服务为停止状态),或发生运行时错误,该函数调用返回,进程终止。

    2、服务入口点函数

    void WINAPI service_main(int argc, char** argv) 
    {       
        ServiceStatus.dwServiceType        = SERVICE_WIN32; 
        ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
        ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; 
        ServiceStatus.dwWin32ExitCode      = 0; 
        ServiceStatus.dwServiceSpecificExitCode = 0; 
        ServiceStatus.dwCheckPoint         = 0; 
        ServiceStatus.dwWaitHint           = 0;  
        hServiceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceHandler); 
        if (hServiceStatusHandle==0) 
        {
            DWORD nError = GetLastError();
        }  
        //add your init code here
    
        //add your service thread here
    
    
        // Initialization complete - report running status 
        ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
        ServiceStatus.dwCheckPoint         = 0; 
        ServiceStatus.dwWaitHint           = 9000;  
        if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus)) 
        { 
            DWORD nError = GetLastError();
        } 
    
    } 

    上面给出的是是服务的入口点函数示例代码。它运行在一个单独的线程当中,这个线程由控制分派器创建。该函数应尽快调用 RegisterServiceCtrlHadler 函数为服务注册控制处理器,注册完控制处理器之后,获得状态句柄(hServiceStatusHandle)。

    ServiceStatus 结构的每个域的用途如下:

    • dwServiceType :指示服务类型,创建 Win32 服务。赋值 SERVICE_WIN32
    • dwCurrentState :指定服务的当前状态。因为服务的初始化在这里没有完成,所以这里的状态为SERVICE_START_PENDING
    • dwControlsAccepted :这个域通知 SCM 服务接受哪个域。本文例子是允许 STOP 和 SHUTDOWN 请求。处理控制请求将在第三步讨论
    • dwWin32ExitCode 和 dwServiceSpecificExitCode :这两个域在你终止服务并报告退出细节时很有用。初始化服务时并不退出,因此,它们的值为 0
    • dwCheckPoint 和 dwWaitHint :这两个域表示初始化某个服务进程时要30 秒以上。本文例子服务的初始化过程很短,所以这两个域的值都为 0

      SetServiceStatus 函数用于向 SCM 报告服务的状态。需要提供 hStatus 句柄和 ServiceStatus 结构。

    3、控制服务处理程序函数

    void WINAPI ServiceHandler(DWORD fdwControl)
    {
        switch(fdwControl) 
        {
            case SERVICE_CONTROL_STOP:
            case SERVICE_CONTROL_SHUTDOWN:
            ServiceStatus.dwWin32ExitCode = 0; 
            ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
            ServiceStatus.dwCheckPoint    = 0; 
            ServiceStatus.dwWaitHint      = 0;
    
            //add you quit code here
    
            break; 
            default:
                return; 
        };
        if (!SetServiceStatus(hServiceStatusHandle,  &ServiceStatus)) 
        { 
            DWORD nError = GetLastError();
        } 
    }

    在第二步中,我们用 RegisterServiceCtrlHadler函数注册了控制处理器函数。控制处理器与处理各种 Windows 消息的窗口回调函数非常类似。它检查 SCM 发送了什么请求并采取相应行动。

    STOP 请求是 SCM 终止服务的时候发送的。例如,如果用户在“ 服务” 控制面板中手动终止服务。SHUTDOWN 请求是关闭机器时,由 SCM 发送给所有运行中服务的请求。两种情况的处理方式相同。

    控制处理器函数必须报告服务状态,即便 SCM 每次发送控制请求的时候状态保持相同。因此,不管响应什么请求,都要调用 SetServiceStatus 。

    创建一个服务

    上面代码编译完成后,可以通过下面指令将其添加为一个服务。注意:该指令运行时需要管理员权限,且“=”后面必须空一格。
    这里写图片描述
    之后我们可以在计算机中看到我们新添加的服务。

    完整的sc create指令说明如下
    这里写图片描述

    另外输入sc可以获取所有相关的控制指令
    这里写图片描述

    启动服务

    可以通过windows提供的控制界面来启动服务,另外还可以使用下面的指令启动服务。
    这里写图片描述

    若服务启动时出现如下错误信息,这是因为运行作为服务的应用程序不是按服务的流程写的。所以运行提示“服务没有及时响应启动或控制请求”
    这里写图片描述

    停止服务

    这里写图片描述

    删除服务

    这里写图片描述

    后记

    我们看到main函数及service_main函数中均有argc、argv参数,也就是说我们是可以向这两个函数中传递参数的,传递参数方法如下。

    • 向main函数中传递参数需要在创建服务时指定
    sc create atest binPath= "D:\Project Files\ImosServer\x64\Release  -port=1024"
    • 向service_main函数中传递参数需要在启动服务时指定
    sc start atest -port=1024

    测试参数传递是否成功,可以在相应位置加入如下代码段。

    FILE* log = fopen("D:\\log.txt", "a");
    for (int i = 0; i < argc; ++i)
    {
        fprintf(log, "main: %s\n", argv[i]);
    }
    fclose(log);

    测试结果如下图所示
    这里写图片描述

    展开全文
  • 微信小程序登录注册demo+java服务器(一)

    万次阅读 多人点赞 2018-05-21 17:32:31
    简单直白的讲就是,xxxServlet会接收微信小程序传过来的请求,然后xxxServlet会调用xxxDao完成请求,而无论是xxxServlet还是xxxDao都会调用xxxDTO来完成函数的调用,util是工具包,这包只有一个类DataAccess,该工具...

    一.开发平台和前期准备

    1.前端工具:微信web开发者工具


    web开发者工具,新建小程序项目,目录和名称自己随意填,AppID点击体验:小程序


    小程序打开后,点击右上方的详情,项目设置,勾选不校验xxxxx

    2.后台开发工具:eclipse

    eclipse要求是java ee版的,并配置好tomcat,后面需要创建Dynamic Web Project

    3.服务器:tomcat

    4.数据库:mysql

    二.目录截图

    1.微信开发者工具目录截图

    其中,.wxml 后缀文件相当于网页的HTML,.wxss文件相当于网页的css,.js 后缀文件是脚本逻辑文件,.json 后缀的 是JSON 配置文件,每一个页面都必定包含这四类文件!

    2.eclipse目录截图

    简单直白的讲就是,xxxServlet会接收微信小程序传过来的请求,然后xxxServlet会调用xxxDao完成请求,而无论是xxxServlet还是xxxDao都会调用xxxDTO来完成函数的调用,util是工具包,这包只有一个类DataAccess,该工具类是为了方便链接数据库。毫无疑问,一个完整的小程序,不会只向服务器发送一个请求,那么这时候我们就需要用到web.xml文件来控制请求的跳转了。

    当然,我们还可以用SSM框架或者SSH框架来实现,但需要导入各种jar包等等一系列操作,并不利于初学者掌握,有兴趣的可以自己学习!

    三.微信开发者工具

    1.login.wxml

    <view class="content">
      <view class="account">
        <view class="title">账号</view>
        <view class="num"><input bindinput="accountInput" placeholder="用户名/邮箱/手机号" placeholder-style="color:#999999;"/></view>
      </view>
      <view class="hr"></view>
       <view class="account">
        <view class="title">密码</view>
        <view class="num"><input bindblur="pwdBlur" placeholder="请输入密码" password placeholder-style="color:#999999;"/></view>
        
      </view>
      <view class="hr"></view>
      <button class="btn" bindtap='login' type="primary">登录</button>
    </view>
    <view>{{message}}</view>

    2.login.wxss

    .content{
      margin-top: 40px;
    }
    .account{
       display: flex;
       flex-direction: row;
       padding-left: 20px;
       padding-top: 20px;
       padding-bottom: 10px;
       width: 90%;
    }
    .title{
       margin-right: 30px;
       font-weight: bold;
    }
    .hr{
      border: 1px solid #cccccc;
      opacity: 0.2;
      width: 90%;
      margin: 0 auto;
      background-color: red;
    }
    .btn{
      width: 90%;
      margin-top:40px;
      color: #999999;
    }

    3.login.js

    Page({
      //定义全局变量data
      data: {
        account: "",
        password: "",
        message:""
      },
      
       //处理accountInput的触发事件
      accountInput:function(e){
        var username = e.detail.value;//从页面获取到用户输入的用户名/邮箱/手机号
        if (username != ''){
          this.setData({ account: username });//把获取到的密码赋值给全局变量Date中的password
        }
      },
      //处理pwdBlurt的触发事件
      pwdBlur:function(e){
          var pwd = e.detail.value;//从页面获取到用户输入的密码
          if (pwd != ''){
            this.setData({ password: pwd });//把获取到的密码赋值给全局变量Date中的password
          }
      },
      //处理login的触发事件
      login: function (e) {
        wx.request({
          url: 'http://localhost:8080/API/login',//后面详细介绍
          //定义传到后台的数据
          data: {
            //从全局变量data中获取数据
            account: this.data.account,
            password: this.data.password,
          },
          method: 'get',//定义传到后台接受的是post方法还是get方法
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
            console.log("调用API成功");
            console.log(res.data.message);
            if (res.data.message=="ok"){
              wx.showToast({
                title: '登陆成功',
              })
            }
            else{
              wx.showModal({
                title: '提示',
                content:'用户名或者密码错误',
                showCancel:false
              })
            }
          },
          fail: function (res) {
            console.log("调用API失败");
          }
        })
      }
    })

    其中,url:'http:localhost:8080/API/login',localhost:8080,只要tomcat默认安装完成,端口没有改就是这个了,API是项目的名称,login是项目文件web.xml中的url-pattern的属性名,url很重要,一定要确保自己没有填错,不然就连接不了服务器了

    4.登陆图

    5.register.wxml

    <!--pages/register/register.wxml-->
    <view class="content">
      <view class="account">
        <view class="title">账号</view>
        <view class="num"><input bindinput="accountInput" placeholder="用户名/邮箱/手机号" placeholder-style="color:#999999;"/></view>
      </view>
      <view class="hr"></view>
       <view class="account">
        <view class="title">密码</view>
        <view class="num"><input bindblur="pwdBlur" placeholder="请输入密码" password placeholder-style="color:#999999;"/></view>
        
      </view>
      <view class="hr"></view>
      <button class="btn" type="primary" bindtap="register">注册</button>
    </view>

    6.register.wxss

    /* pages/register/register.wxss */
    .content{
      margin-top: 40px;
    }
    .account{
       display: flex;
       flex-direction: row;
       padding-left: 20px;
       padding-top: 20px;
       padding-bottom: 10px;
       width: 90%;
    }
    .title{
       margin-right: 30px;
       font-weight: bold;
    }
    .hr{
      border: 1px solid #cccccc;
      opacity: 0.2;
      width: 90%;
      margin: 0 auto;
    }
    .see{
      position: absolute;
      right: 20px;
    }
    .btn{
      width: 90%;
      margin-top:40px;
      color: #999999;
    }
    .operate{
       display: flex;
       flex-direction: row;
    }
    .operate view{
      margin: 0 auto;
      margin-top:40px;
      font-size: 14px;
      color: #333333;
    }
    .register{
      display: flex;
      flex-direction: row;
      margin-top:150px;
    }
    .register view{
      margin: 0 auto;
    }

    7.register.js

    // pages/register/register.js
    Page({
    
      /**
       * 页面的初始数据
       * data为全局变量
       */
      data: {
        account: "",
        password: ""
      },
    
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
      
      },
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
      
      },
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
      
      },
    
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
      
      },
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
      
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
      
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
      
      },
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
      
      },
      
      //处理accountInput的触发事件
      accountInput: function (e) {
        var username = e.detail.value;//从页面获取到用户输入的用户名/邮箱/手机号
        if (username != '') {
          this.setData({ account: username });//把获取到的密码赋值给date中的password
        }
      },
      //处理pwdBlur的触发事件
      pwdBlur: function (e) {
        var pwd = e.detail.value;//从页面获取到用户输入的密码
        if (pwd != '') {
          this.setData({ password: pwd });//把获取到的密码赋值给date中的password
        }
      },
      //处理register的触发事件
      register: function (e) {
        wx.request({
          url: 'http://localhost:8080/API/register',
          //定义传到后台的数据
          data: {
            //从全局变量data中获取数据
            account: this.data.account,
            password: this.data.password
          },
          method: 'get',//定义传到后台接受的是post方法还是get方法
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
            console.log("调用API成功");
            wx.switchTab({
              url: '../login/login'  // 注册成功,跳转到登陆页面
            })
          },
          fail: function (res) {
            console.log("调用API失败");
          }
        })
      }
    })

    8.注册图

        

    9.app.json

    {
      "pages": [
        "pages/login/login",
        "pages/register/register"
      ],
      "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "登录",
        "navigationBarTextStyle": "black"
      },
      "tabBar": {
        "list": [
          {
            "pagePath": "pages/login/login",
            "text": "登陆"
          },
          {
            "pagePath": "pages/register/register",
            "text": "注册"
          }
        ]
      }
    }

    10.小结

    以上部分是一个完整的微信小程序的前端部分,对于有一定HTML和CSS基础的人,应该不难看懂,假如看不懂,可以先去看看微信小程序开发文档



    展开全文
  • 怎样把任意exe程序注册成windows系统服务(手动注册服务)1.要实现这个功能要用到微软提供的两个小工具“instsrv.exe”和“srvany.exe”(下载地址:http://www.cr173.com/soft/64394.html)。先下载这两个程序然后放在...
  • 将命令注册为windows服务

    万次阅读 2018-09-12 16:07:57
    情景:我在本地部署了一个springboot项目,需要通过 java -war xxxx.war 命令来启动项目。每次都要到这个目录下,很麻烦。...将.bat文件注册到系统服务中   开始 1.将命令写入到.bat文件,通过双击bat...
  • 文章目录前期准备打包成可执行jar包注册成为liunx服务...将Spring Boot应用程序注册成为系统服务 在之前的文章中,我们提到了很多Spring Boot的技巧,那么当我们创建好了Spring Boot应用程序之后,怎么在生成环境...
  • 下面我们开始注册服务。已管理员的身份运行命令行,首先进入工具所在的文件夹,如:c:\tools。执行c:\toolsinstsrv.exe ServerName srvany.exe这样我们就创建了一个名为ServerName的srvany的服务,那么我们自己的exe...
  • 有点对不起观众了,本博客写了好几篇关于微信小程序方面的知识,但是居然没有写最应该写的一篇关于微信小程序开发者注册的博文,现在就来补上这个漏洞,虽然这只是涉及微信小程序皮毛的知识点,但是肯定会帮助有需要...
  • 将任何应用程序注册成后台服务程序,即:系统启动后该程序可以自动启动,并且在前台不要出现运行窗口。 解决办法:需要使用Windows提供的两个工具instsrv.exe和srvany.exe。(Windows 2003资源工具包带有) instsrv...
  • sc命令可以注册windows服务 实现程序后台运行和开机自启
  • ---显示---提示的解决方案。 启动Net Manager,在“监听程序”--Listener下... 重启监听服务。 启动Database configuration Assistant “配置数据库选件”就可以重新配置em了,而不用删除数据库。再次创...
  • exe程序注册成windows系统服务

    千次阅读 2015-12-25 14:48:48
    C#写好的.exe程序,今天突然需要把它改成windows系统服务,让系统替你自动跑起来。今天总结了一下,第一次写,供大家一起分享,望各位朋友多多指导。 我用的是rktools.exe 工具,找到里面的instsrv.exe 和srvany....
  • 微信小程序面试题总结

    万次阅读 多人点赞 2019-10-23 09:43:07
    程序面试题 简单描述下微信小程序的相关文件类型? 一、WXML (WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。内部主要是微信自己定义的一套组件。与html...
  • 用instsrv将普通exe程序注册服务

    千次阅读 2017-01-23 14:35:47
    当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,这里使用instsrv,语法如下: 1.安装 instsrv zzMyService srvany.exe 卸载 instsrv zzMyService remove...
  • 微信小程序开发教程手册文档

    万次阅读 多人点赞 2018-06-28 14:25:48
    微信小程序开发教程文档微信小程序是什么?微信小程序如何开发?微信小程序开发教程有哪些?本教程将从微信小程序本身,结合微信官方-微信小程序开发工具,带你一步步创建一个微信小程序,并在手机操作预览该小程序...
  • 【微信小程序控制硬件第1篇 】 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! 【微信小程序控制硬件第2篇 】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的...
  • 将exe程序注册成后台服务程序

    千次阅读 2017-06-05 22:04:25
    背景:公司需要做一个局域网内的视频监控系统内嵌到网页上,视频监控厂家给的插件自带有一个exe的服务程序,必须长时间开启视频才能正常显示,这样在客户那不明白的情况下会认为是无用的程序关闭后视频就无法正常...
  • 微信小程序开发指南(新手必备)

    万次阅读 多人点赞 2019-05-23 16:44:37
    前言:本文主要讲解微信小程序开发流程,环境配置以及注意事项,减少新手走弯路 1、服务器环境准备说明 1.1 公网网络和域名可用性 确保服务器公网网络正常,且指向公网IP的域名已备案,状态正常 由于微信小...
  • golang程序在windows上,注册服务

    千次阅读 2016-11-25 12:13:22
    package main import ( "log" ...注册服务步骤 1. 运行demo/main.go 得到demo.exe文件 2. 打开cmd 切换到Demo项目目录 3. 运行输入 demo.exe install 注册服务成功 4. 注册服务成功
  • 从开发模式上说,它是前后端分离的,微信小程序负责实现前端应用,后端服务可以使用任何你说熟知的开发语言,如PHP、NodeJs、Java、C#、Python等,因而,微信小程序的开发文档主要是围绕WXML、WXSS等前端框架、组件...
  • 每次以cmd方式启动Nginx服务不符合实际要求,于是我们想到将其注册为Windows服务,并...这里,我们使用一个不错的小程序:“Windows Service Wrapper”,将nginx.exe注册为Windows服务,具体的步凑如下: ①下载最新版
  • MFC应用程序 变身成 windows服务程序

    千次阅读 2016-11-09 11:20:03
    非常简单实现MFC应用程序到windows服务程序的转变,简单的就一句话“奥特曼变身”
  • Ubuntu 18.04服务注册方法

    千次阅读 2019-01-25 10:15:10
    背景 systemd is now used for user sessions. System sessions had already been provided by systemd in previous Ubuntu releases. Ubuntu-18.04用 systemctl 命令来...比如以前启动mysql服务,命令为:...
  • 严重: 监听程序未启动或数据库服务注册到该监听程序。启动该监听程序注册数据库服务, 然后重新运行 EM Configuration Assistant。 有关详细资料, 请参阅 D:\Oracle\cfgtoollogs\dbca\orcl\emConfig.log 中的...
  • 如何将控制台程序发布为服务

    万次阅读 2019-05-24 11:27:00
    双击该服务=>右击 => 添加安装程序  选择serviceProcessInstaller1 设置Account 为 LocalSystem  代码和设置部分已完成,生成项目. 三.安装服务  1.以管理员身份运行 cmd  2.进入生成目录:E...
  • 微服务+微信小程序实现社区服务

    万次阅读 多人点赞 2020-10-19 00:13:50
    我在上大学的时候毕业设计做的是微服务`SpringCloud`结合微信小程序实现一个提供一些生活服务的微信小程序,它主要可以提供豆瓣电影资讯、热点新闻、天气预报、停车位预约等生活服务,也用到了一些分布式的技术比如...
  • 如何注册一个Windows服务

    万次阅读 2018-12-29 16:56:22
    目录介绍注服务一:创建服务二:修改注册表三:设置该服务 介绍 instsrv.exe可以创建和删除服务,然而如果没有srvany.exe的参与,创建的服务可能无法启动。那么srvany.exe做了些什么呢,启动服务后我们可以在任务...
  • 注册golang程序为windows服务

    千次阅读 2017-08-22 00:22:57
    golang注册为windows服务中遇到的问题

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 579,034
精华内容 231,613
关键字:

程序注册服务