前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >安卓基础干货(三):安卓数据库的学习

安卓基础干货(三):安卓数据库的学习

作者头像
緣來
发布于 2018-09-18 09:54:06
发布于 2018-09-18 09:54:06
3.1K00
代码可运行
举报
文章被收录于专栏:緣來來來緣來來來
运行总次数:0
代码可运行

title: 安卓基础干货(三):安卓数据库的学习 copyright: true categories: 安卓基础干货 date: 2018-01-10 19:35:26

tags: [Android]

android下数据库的创建(重点)

Android平台上,集成了一个嵌入式关系型数据库SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,也接受varchar(n)、char(n)、decimal(p,s) 等数据类型, SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略 name字段的类型信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

SQLite可以解析大部分标准SQL语句,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句,如:
    select * from person
    select * from person order by id desc
    select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
    select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person  where id=10    
获取添加记录后自增长的ID值:SELECT last_insert_rowid()

SQLiteOpenHelper:管理数据库的版本

在android应用程序中创建按数据库的步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、写一个DBHelper,继承了SQLiteOpenHelper,重新写了父类的构造方法、onCreate、onUpGrade:
//创建数据库
DBHelper helper = new DBHelper(this, "account.db", null, 1);

onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录

onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构

2、调用db = helper.getWritableDatabase(),得到数据对象

数据库sql语句的增删改查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
创建表结构:create table person (id integer primary key autoincrement,name varchar(20));
插入:insert into person (name)values("lisi");
查询:select * from person;
更新:update person set name='wangwu' where id=1
删除:delete from person where id=1

android下数据库的增删改查(重点)

在android应用程序中使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.execSQL("sql",bindArgs)

操作增删改查语句;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.创建表结构
public void create(View v){ 
    db.execSQL("create table person (id integer primary key autoincrement,name varchar(20))", new Object[]{});
    Toast.makeText(this, "创建表结构成功", 0).show();
}

2.插入    
public void insert(View v){
    db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
    Toast.makeText(this, "插入数据成功", 0).show();
}

3.查询:
//db.rawQuery,cursor类似于一个指针,当cursor指向一条记录时,就把当前记录的数据封装到cursor中,直接从cursor取数据
public void query(View v){

    Cursor cursor = db.rawQuery("select * from person",null);

    //移动游标,返回值为true表示没有移动到数据集的最后(空),如果为false已经数据集的最后(没有数据了)
    while(cursor.moveToNext()){
        int id = cursor.getInt(0);
        String name = cursor.getString(1);
        System.out.println("id="+id+"; name="+name);
    }
    Toast.makeText(this, "查询数据成功", 0).show();
}

4.更新    
public void update(View v){
    db.execSQL("update person set name='wangwu' where id=?", new Object[]{1});
    Toast.makeText(this, "更新数据成功", 0).show();
}

5.删除      
public void delete(View v){
    db.execSQL("delete from person where id=?", new Object[]{1});
    Toast.makeText(this, "删除数据成功", 0).show();
}

数据库的另外一种增删改查方法(重点)

使用google提供的另外一种方式操作数据库表:

1、插入数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void insert(View v){

    //db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
    ContentValues values = new ContentValues();
    Random r = new Random();
    values.put("name", "zhangsan"+r.nextInt(100));
    long rowId =  db.insert("person", null, values);
    System.out.println("rowId="+rowId);
    Toast.makeText(this, "插入数据成功", 0).show();
}

2、查询数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void query(View v){
    /**
    * table 表名
    * columns 查询的列
    * selection 查询条件"id=1"
    * selectionArgs 查询条件的值
    * String groupBy
    * String having
    * String orderBy
    * 
    */
    Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);
    while(cursor.moveToNext()){
        int id = cursor.getInt(0);
        String name = cursor.getString(1);
        System.out.println("id="+id+"; name="+name);
    }
    Toast.makeText(this, "查询数据成功", 0).show();
}

public void update(View v){

    //db.execSQL("update person set name='wangwu' where id=?", new Object[]{1});
    //用来封装要修改的列名和值
    ContentValues values = new ContentValues();
    values.put("name", "wangwu");
    db.update("person", values, "id=?", new String[]{"1"});
    Toast.makeText(this, "更新数据成功", 0).show();
}

public void delete(View v){

    //db.execSQL("delete from person where id=?", new Object[]{1});
    db.delete("person", "id=?", new String[]{"2"});
    Toast.makeText(this, "删除数据成功", 0).show();
}

命令行查看数据库

使用adb shell进入模拟器或者手机的控制台; 使用cd切换到数据库文件所在的目录; 使用sqlite3 数据库文件的名称打开数据; 使用增删改查语句操作数据库。

数据库的事务(重点)

什么是事务:同一组操作要么同时成功,要么同时失败;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zhangsan -> lisi 100yuan
1、zhangsan - 100
2、lisi + 100
  • 在android应用程序中使用SQLite数据库事务的步骤:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try{
    //1、在业务逻辑开始的时候开启事务:
    db.beginTransaction();
    //张三转出100
    ContentValues values = new ContentValues();
    values.put("money", "1900");
    db.update("account", values, "id=?", new String[]{"1"});

    //李四收到100
    ContentValues values02 = new ContentValues();
    values02.put("money", "102");
    db.update("account", values02, "id=?", new String[]{"2"});

    //2、 在业务逻辑结束的时候告诉系统数据库提交成功
    db.setTransactionSuccessful();
} finally{
    //3、告诉系统数据库结束
    db.endTransaction();
}

listview的使用(重点)

ListView :用来在界面上显示数据列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getCount 
GetView()

listview显示数据的原理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MVC :
javaweb 
mode: javabean
view: 破jsp
controller:破servlet 

//(1)
对listview的优化 
convertview:  

MVC:
Model  Person  数据
View   ListView
Controle:  Adapter 数据适配器

使用listview显示数据列表的步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、在布局文件中添加一个listview控件
2、在代码中找到这个listview控件
3、创建一个数据适配器为listview填充数据

ArrayAdapter

使用ArrayAdapter为listview填充数据的步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、在布局文件中添加ListView
2、在代码中初始化这个listview控件
3、调用listview.setAdapter()填充数据
//使用适配器为listview填充数据
//new ArrayAdapter:context 上下文,resourceId 条目布局文件的资源ID,object[] 要显示的数据
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item, new String[]{"王菲","谢霆锋","张柏芝","李亚鹏"}));

SimpleAdapter

使用ArrayAdapter为listview填充数据的步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、在布局文件中添加ListView
2、在代码中初始化这个listview控件
3、调用listview.setAdapter()填充数据
//使用适配器为listview填充数据
//new SimpleAdapter:context 上下文,resourceId 条目布局文件的资源ID,String[] 要显示的列名,int[] 指定列显示在item布局文件的哪个控件上
lv.setAdapter(new SimpleAdapter(this, data, R.layout.item,  new String[]{"id","name"}, new int[]{R.id.tv_id,R.id.tv_name}));

条目的布局文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/tv_id"
      />

    <TextView 
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/tv_name"
      />

</LinearLayout>

复杂listview界面的显示(重点)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
步骤:
1、在布局文件中添加ListView
2、在代码中初始化这个listview控件
   lv = (ListView) findViewById(R.id.lv);
3、自定义数据适配器,继承了BaseAdapter,重写4个方法,其中getCount、getView是我们关系的

private class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() { 
        return 20;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = View.inflate(MainActivity.this, R.layout.item, null);

        ImageView iv = (ImageView) view.findViewById(R.id.iv);

        TextView tv_title = (TextView) view.findViewById(R.id.tv_title);

        tv_title.setText("111");

        TextView tv_desc = (TextView) view.findViewById(R.id.tv_desc);
        tv_desc.setText("2222");
        return view;
    }


    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
}

4、调用lv.setAdapter(new MyAdapter())填充数据

数据库listview界面的显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends Activity {

private SQLiteDatabase db;
private ListView lv;
private List<Person> list;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //初始化listview控件
    lv = (ListView) findViewById(R.id.lv);
    DBHelper helper = new DBHelper(this, "persons.db", null, 1); 
    db = helper.getWritableDatabase();

}

public void insert(View v){

    //db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
    ContentValues values = new ContentValues();
    Random r = new Random();
    values.put("name", "zhangsan"+r.nextInt(100));
    long rowId =  db.insert("person", null, values);
    System.out.println("rowId="+rowId);
    Toast.makeText(this, "插入数据成功", 0).show();
}


public void query(View v){

    list = new ArrayList<Person>();
    /**
    * table 表名
    * columns 查询的列
    * selection 查询条件"id=1"
    * selectionArgs 查询条件的值
    * String groupBy
    * String having
    * String orderBy) 
    * 
    */
    Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);

    while(cursor.moveToNext()){

        Person p = new Person();
        int id = cursor.getInt(0);
        p.setId(id);
        String name = cursor.getString(1);
        p.setName(name);
        list.add(p);
        System.out.println("id="+id+"; name="+name);
    }

    //把数据显示到列表
    lv.setAdapter(new MyAdapter());
    Toast.makeText(this, "查询数据成功", 0).show();
}

/**
 *创建一个数据适配器,为listview填充数据
 */
private class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() { 
        return list.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if(convertView != null){
            view = convertView;
        }
        else{
            view = View.inflate(MainActivity.this, R.layout.item, null);
        }

        TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
        TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
        Person p = list.get(position);

        tv_id.setText(p.getId()+"");

        tv_name.setText(p.getName());
        return view;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【指引】两种方式,轻松关联企业微信
指引篇 企业微信如何和TAPD关联? TAPD入口+企业微信市场入口 跟着我们的指引走准没错! 注:是企业微信和TAPD的公司管理员才可以哦。 一、TAPD入口 进入TAPD官网,找到接入入口 目前TAPD有两个接入企业微信的入口: 1、在TAPD官网上的企业微信介绍页,点击「接入企业微信」,选择TAPD版本,确认相关信息后,即可开始进入企业微信授权流程。  2、点击登录TAPD,进入「公司设置 - 服务集成」,选择关联企业微信,跳转至企业微信进行授权。 登录企业微信,授权TAPD
TAPD敏捷研发
2018/08/23
2.6K0
【指引】两种方式,轻松关联企业微信
企业邮箱被盗,涉及金额高达20万美元!邮箱安全不可忽视
邮箱被盗,冒充工作人员,告之对方银行账号,要求付款到黑客指定的银行账号,涉及金额高达20万美元!
IT狂人日志
2022/12/08
6110
企业邮箱被盗,涉及金额高达20万美元!邮箱安全不可忽视
攻防|企业钓鱼演练的一些总结和经验
由于传播、利用本公众号亿人安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号亿人安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
亿人安全
2024/01/23
3730
攻防|企业钓鱼演练的一些总结和经验
像追女孩一样去渗透之信息收集
在IT行业摸索了很多年终于找到了一生所爱(信息安全),为了这份爱能传递下去,我将以这份脱单攻略来讲述我是如何get挚爱shell!希望大家都能get到女神的shell
黑伞安全
2019/10/16
3.3K0
WeCom——通过企业微信来搭建自己的域名邮箱
注册/开通腾讯企业邮箱流程: https://open.work.weixin.qq.com/help2/pc/16885?person_id=1 什么是域名的MX记录及设置方法: https://open.work.weixin.qq.com/help2/pc/15333?person_id=1 如何开启腾讯企业邮箱的POP/SMTP/IMAP服务: https://open.work.weixin.qq.com/help2/pc/19886?person_id=1&searchData= 常用邮件客户端软件设置: https://work.weixin.qq.com/help?person_id=0&doc_id=431&helpType=exmail
思索
2024/08/15
1.1K0
WeCom——通过企业微信来搭建自己的域名邮箱
【IT服务管理】国内企业需要什么样的ITSM产品?
20世纪80年代,英国商务部制定的ITIL,对IT服务的内容和实践提供了客观、清晰、可量化的标准和规范。此后ITIL成为IT管理最广泛的国际标准,它提供了一组最佳实践框架,可以帮助企业更好地实施ITSM。
腾讯云安灯_Yangxu
2023/10/23
9090
【IT服务管理】国内企业需要什么样的ITSM产品?
一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
0x00. 引言 我用swaks 发送一封以我们公司CTO为显示发件人(腾讯企业邮箱)的伪造邮件给我的一个同事,邮件的内容就是让这位同事去CTO的办公司一趟,没想到这位同事真的去了,然后一脸懵逼的回来了。 恶作剧算是完了,但是这让我开始研究伪造邮件是为什么产生的,腾讯企业邮为什么没有拦截。 0x01. 关于伪造邮件的一些总结 1) 邮件服务商之间转发邮件是不需要认证的,也就是说MTA 到MTA之间转发邮件是不需要认证的,这是SMTP协议本身定义的。 所以协议钓鱼邮件就可以伪称来自某某MTA发送钓鱼邮件;
FB客服
2018/02/28
6.2K0
一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
企业微信功能预览——使用教程
1、企业微信与微信互通,可以直接使用企业微信添加微信好友,成为联系人后,像普通微信好友一样聊天沟通,同样支持文本、图片、语音、名片、聊天记录、地理位置、收藏和H5收发,也可以跟微信好友语音视频沟通,支持对客户进行标签管理;
用户6806031
2019/12/05
10K0
企业微信功能预览——使用教程
利用企业邮件系统构造命令控制(C&C)和数据窃取(Exfiltration)通道的思路探讨
本文通过对高度安全环境中,渗透入侵完成后,传统的基于Web和DNS管理控制目标系统不可行条件下,利用企业网页邮箱系统进行命令控制(C&C)和数据窃取(Exfiltration)的一种思路分享探讨。 假设场景 我们假设目标企业组织内设置了这样一种安全措施: 内部用户工作站电脑不能直接连接互联网,只能通过其中架设的代理服务器执行外部Web请求和DNS查询,而且代理服务器又设置了流量监控功能,由其产生的HTTP和DNS请求流量都能被监测发现。 由于从某种程度上来说,代理服务器“打破”了内部用户机与外部服务器
FB客服
2018/02/24
2K0
利用企业邮件系统构造命令控制(C&C)和数据窃取(Exfiltration)通道的思路探讨
超方便!在微信里「邮件办公」,用这小程序就对了 | 亲儿子 #21
如果你和我一样,不想将私人邮箱和工作邮箱混在一起,又不想多安装一个邮箱 App,那么知晓程序(微信号 zxcx0101)今天推荐的小程序,绝对值得你一试。
知晓君
2018/07/27
2.9K1
如何设置免费网易企业邮箱
什么样的邮箱是企业邮箱?比如 admin@vpsss.net,这种形式的邮箱就可以称之为企业邮箱。做外贸用企业邮箱能有效提高公司形象,便于管理员工工作质量和工作进度,国内企业邮箱很多,做外贸老魏用过网易企业邮箱(付费版本),网易企业邮箱有国外服务器,不会漏掉你和国外客户的往来邮件;同时可以批量发送开发信而不被国外邮局屏蔽。有了这些亲身经历所以今天老魏讲解如何设置免费网易企业邮箱。 1. 注册并填写资料 在浏览器地址栏里面输入网易企业邮箱注册地址 ym . 163 . com 就可以打开网易企业邮箱首页,点击
魏艾斯博客www.vpsss.net
2018/06/01
6.1K0
【奶奶看了也不会】微信群聊(微信客服)接入ChatGPT教程
大家好,我是小卷。最近工作变卷了,都已经一个月没更新文章了。今天来教教大家怎么给微信群聊的智能客服接入ChatGPT。和之前企业微信机器人不同的是,这次是可以外部微信群使用的。用的人会更多哦~
卷福同学
2023/06/25
3.3K0
【奶奶看了也不会】微信群聊(微信客服)接入ChatGPT教程
【玩转Lighthouse】利用lighthouse搭建邮局管理系统
其实这个系统应该功能还是比较丰富的,各种设置,还有什么反垃圾系统的自动学习啥的。 不过因为是本地的ip,所以在邮箱得分中并不是很高,很容易就标识为垃圾邮件进入别人的垃圾箱。而且那段时间群晖出了点问题经常关机,总之使用上并不是太方便,特别是接重要邮件的时候总是担心会不会没收到。
用户7917993
2022/04/19
2.8K0
域名邮箱-宝塔邮局管理器
不过因为是本地的ip,所以在邮箱得分中并不是很高,很容易就标识为垃圾邮件进入别人的垃圾箱。而且那段时间群晖出了点问题经常关机,总之使用上并不是太方便,特别是接重要邮件的时候总是担心会不会没收到。
星橙
2022/11/28
5.6K0
域名邮箱-宝塔邮局管理器
实战渗透 | 情侣空间钓鱼邀请,撸它
此程序是一份仅提供Web编程模仿技术研究,社会工程师水平锻炼,网络防骗流程深入研究的一份程序,并且程序性质不为公开性。
HACK学习
2019/11/26
3.7K0
实战渗透 | 情侣空间钓鱼邀请,撸它
欢迎使用企业微信文档
企业微信文档是支持多人、多设备协同编辑和实时保存的在线文档。你可以在这里完成个人创作,或与同事一起编辑、讨论,提升协作效率。
深圳夏天
2022/04/08
11.7K0
挺火的企业微信每日推送超详细保姆级教程
在上篇推文《程序员的浪漫实现每天定时给Ta推送消息提醒保姆级教程》中给大家介绍了微信测试号的方式推送消息,但是存在以下大家很不喜欢的问题:
Lcry
2022/11/29
7.6K9
挺火的企业微信每日推送超详细保姆级教程
挖洞经验 | 利用密码重置功能实现账号劫持
最近,我参加了某平台邀请的漏洞测试项目,在其中发现了一个独特的账号劫持漏洞,整个漏洞发现过程非常意外也非常幸运,通过密码重置功能就能实现账号劫持,在此我就把它写成 writeup 分享出来。由于测试项目的保密和隐私原则,抱歉截图太少,且下文中涉及的网站域名部分我已作了编辑隐藏,敬请见谅。
FB客服
2018/07/30
1.2K0
挖洞经验 | 利用密码重置功能实现账号劫持
建站新手错把“一女嫁二夫” NS解析错误导致网站或企业邮箱打不开
NS解析对于经常建站的老手来说已经驾轻就熟了,添加 A 记录、MX 记录、CNAME 记录都很熟练,几分钟就可以搞定。不过对于建站新手来说还是比较蒙圈,搞不清什么是 NS解析及怎么做解析的问题。今天借着帮群友解决问题的同时,魏艾斯博客也把新手容易误操作的 NS解析问题详细的解释一下,因为实在太基础而又见过太多新手在这里犯错误(主要是蒙圈性质的糊涂,来回折腾两次他们自己都搞不清楚哪个是哪个,乱套了),老鸟可以略过本文内容了,看了容易打瞌睡:)。
魏艾斯博客www.vpsss.net
2018/12/14
5.6K0
建站新手错把“一女嫁二夫” NS解析错误导致网站或企业邮箱打不开
多账号管理和一个账号管理多个网站的网站后台管理SaaS系统在腾讯云服务器部署教程
多站点CMS网站内容管理后台可以管理多个网站,由于客户有多个公司,开发多个网站,可是按照传统CMS管理系统只能是一个后台管理一个网站,而且还需要独立部署;对开发和维护也麻烦,用户后期管理网站也麻烦(需要管理对个后台账号密码)。还有很多后台是php开发的,政府性网站经常遭到同行攻击,主要还是和php不可编译有关。所以综合以上种种,结合Go和PHP各自优点开发一套CMS内容管理后台,支持多个企业账号、多个站点、在线编辑网站,无需每次建站都部署,一次部署即可一直新增网站和开客户账号即可(不再像以前一个家一家单独部署),目前CMS已经用于实际企业网站管理,并在维护中比以前要省心,一套系统要做运行正常,所有网站都正常,您可以根据需要二次开发,例如:域名到期提醒,SSL证书到期提醒,用户维护未到期提醒等等。
用户2848031
2023/08/23
1.1K0
多账号管理和一个账号管理多个网站的网站后台管理SaaS系统在腾讯云服务器部署教程
推荐阅读
相关推荐
【指引】两种方式,轻松关联企业微信
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验