• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

williamwen1986/Luakit: A multi-platform solution in lua , you can develop your a ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称(OpenSource Name):

williamwen1986/Luakit

开源软件地址(OpenSource Url):

https://github.com/williamwen1986/Luakit

开源编程语言(OpenSource Language):

C 56.6%

开源软件介绍(OpenSource Introduction):

Luakit

A multi-platform solution in lua , you can develop your app, IOS or android app with this tool, truely write once , use everywhere. Notice , you can only use Luakit to write business logic code including network, db orm, multithread model, but not UI code, Luakit do not provide api for UI development.

Why write apps with Luakit?

I will say Luakit is the most effective tool to develop apps on more than one platform. Here are some reasons

  • Cross platform, truely write once use everywhere, this feature is very attractive, if you have experienced multi-platform development , cross platform architecture will be very impressive for you. It can promote efficiency largely.

  • Dynamic and flexible, write business logic code in lua , you can release your code anytime, truely agile development.

  • Forget the annoying memory management, lua support automatic garbage collection. Lua has closures, also known as blocks. These features make Luakit much more effective than other c++ cross platform solution.

Examples

For some simple Luakit apps, check out the source folder.

Multithreading

We provide some powerful multi-threading api in lua , you can see ThreadTest in Android Demo folder and IOS Demo folder. Notice , It is not only thread safety multithreading model, but also really competition multithreading model. It is the unique solution to perform competition multithreading in lua or js.

Create thread , demo code

-- Parma1 is the thread type ,there are five types of thread you can create.
-- BusinessThreadUI
-- BusinessThreadDB
-- BusinessThreadLOGIC
-- BusinessThreadFILE
-- BusinessThreadIO
-- Param2 is the thread name
-- Result is new threadId which is the token you should hold to do further action
local newThreadId = lua_thread.createThread(BusinessThreadLOGIC,"newThread")

Perform method on a specified thread async, demo code

-- Parma1 is the threadId for which you want to perform method
-- Parma2 is the modelName
-- Parma3 is the methodName
-- The result is just like you run the below code on a specified thread async
-- require(modelName).methodName("params", 1.1, {1,2,3}, function (p)
-- end)
lua_thread.postToThread(threadId,modelName,methodName,"params", 1.1, {1,2,3}, function (p)
	-- do something here
end)

Perform method on a specified thread sync, demo code

-- Parma1 is the threadId for which you want to perform method
-- Parma2 is the modelName
-- Parma3 is the methodName
-- The result is just like you run the below code on a specified thread sync
-- local result = require(modelName).methodName("params", 1.1, {1,2,3}, function (p)
-- end)
local result = lua_thread.postToThreadSync(threadId,modelName,methodName,"params", 1.1, {1,2,3}, function (p)
	-- do something here
end)

ORM

Luakit provide a orm solution which has below features

  • Object-oriented interfaces
  • Automatically create and update table schemas.
  • Has internal cache
  • Timing auto transaction
  • Thread safe

android orm test

image

image

image

ios orm test

image

image

image

Define your model, demo code

-- Add the define table to dbData.lua
-- Luakit provide 7 colum types
-- IntegerField to sqlite integer 
-- RealField to sqlite real 
-- BlobField to sqlite blob 
-- CharField to sqlite varchar 
-- TextField to sqlite text 
-- BooleandField to sqlite bool
-- DateTimeField to sqlite integer
user = {
	__dbname__ = "test.db",
	__tablename__ = "user",
	username = {"CharField",{max_length = 100, unique = true, primary_key = true}},
	password = {"CharField",{max_length = 50, unique = true}},
	age = {"IntegerField",{null = true}},
	job = {"CharField",{max_length = 50, null = true}},
	des = {"TextField",{null = true}},
	time_create = {"DateTimeField",{null = true}}
	},
-- when you use, you can do just like below
local Table = require('orm.class.table')
local userTable = Table("user")

Insert data, demo code

local userTable = Table("user")
local user = userTable({
	username = "user1",
	password = "abc",
	time_create = os.time()
})
user:save()

Update data, demo code

local userTable = Table("user")
local user = userTable.get:primaryKey({"user1"}):first()
user.password = "efg"
user.time_create = os.time()
user:save()

Delete data, demo code

local userTable = Table("user")
local user = userTable.get:primaryKey({"user1"}):first()
user:delete()

Batch update, demo code

local userTable = Table("user")
userTable.get:where({age__gt = 40}):update({age = 45})

Batch Delete, demo code

local userTable = Table("user")
userTable.get:where({age__gt = 40}):delete()

Select, demo code

local userTable = Table("user")
local users = userTable.get:all()
print("select all -----------")
local user = userTable.get:first()
print("select first -----------")
users = userTable.get:limit(3):offset(2):all()
print("select limit offset -----------")
users = userTable.get:order_by({desc('age'), asc('username')}):all()
print("select order_by -----------")
users = userTable.get:where({ age__lt = 30,
	age__lte = 30,
	age__gt = 10,
	age__gte = 10,
	username__in = {"first", "second", "creator"},
	password__notin = {"testpasswd", "new", "hello"},
	username__null = false
	}):all()
print("select where -----------")
users = userTable.get:where({"scrt_tw",30},"password = ? AND age < ?"):all()
print("select where customs -----------")
users = userTable.get:primaryKey({"first","randomusername"}):all()
print("select primaryKey -----------")

Join, demo code

local userTable = Table("user")
local newsTable = Table("news")
local user_group = newsTable.get:join(userTable):all()
print("join foreign_key")
user_group = newsTable.get:join(userTable,"news.create_user_id = user.username AND user.age < ?", {20}):all()
print("join where ")
user_group = newsTable.get:join(userTable,nil,nil,nil,{create_user_id = "username", title = "username"}):all()
print("join matchColumns ")

Http request

Luakit provide a http request interface, it has an internal dispatcher which contains a FIFO queue , here is the source code, demo code

-- url , the request url
-- isPost, boolean value represent post or get
-- uploadContent, string value represent the post data
-- uploadPath,  string value represent the file path to post
-- downloadPath, string value to tell where to save the response
-- headers, tables to tell the http header
-- socketWatcherTimeout, int value represent the socketTimeout
-- onResponse, function value represent the response callback
-- onProgress, function value represent the onProgress callback
lua_http.request({ url  = "http://tj.nineton.cn/Heart/index/all?city=CHSH000000",
	onResponse = function (response)
	end})

Async socket

Luakit provide a non-blocking interface for socket connect , demo code

local socket = lua_asyncSocket.create("127.0.0.1",4001)

socket.connectCallback = function (rv)
    if rv >= 0 then
        print("Connected")
        socket:read()
    end
end
    
socket.readCallback = function (str)
    print(str)
    timer = lua_timer.createTimer(0)
    timer:start(2000,function ()
        socket:write(str)
    end)
    socket:read()
end

socket.writeCallback = function (rv)
    print("write" .. rv)
end

socket:connect()

Notification

Luakit provide a notification system by which notifications can transfer through the lua environment and native environment

Lua register and post notification, demo code

lua_notification.createListener(function (l)
	local listener = l
	listener:AddObserver(3,
	    function (data)
	        print("lua Observer")
	        if data then
	            for k,v in pairs(data) do
	                print("lua Observer"..k..v)
	            end
	        end
	    end
	)
end);

lua_notification.postNotification(3,
{
    lua1 = "lua123",
    lua2 = "lua234"
})

Android register and post notification,, demo code

LuaNotificationListener  listener = new LuaNotificationListener();
INotificationObserver  observer = new INotificationObserver() {
    @Override
    public void onObserve(int type, Object info) {
        HashMap<String, Integer> map = (HashMap<String, Integer>)info;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            Log.i("business", "android onObserve");
            Log.i("business", entry.getKey());
            Log.i("business",""+entry.getValue());
        }
    }
};
listener.addObserver(3, observer);

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("row", new Integer(2));
NotificationHelper.postNotification(3, map);

IOS register and post notification,, demo code

_notification_observer.reset(new NotificationProxyObserver(self));
_notification_observer->AddObserver(3);
- (void)onNotification:(int)type data:(id)data
{
    NSLog(@"object-c onNotification type = %d data = %@", type , data);
}

post_notification(3, @{@"row":@(2)});

Setup

Set up Luakit in flutter project

Set up Luakit in android with jitpack

Set up Luakit in IOS with cocoaPod

Set up Luakit in android with source code

Set up Luakit in IOS with source code

IDE AndroidStudio

We provide an AndroidStudio plugin named Luakit, you can develop with AndroidStudio, we provide many useful features, demonstrate how to debug Luakit with AndroidStudio

  • Remote Debugger
  • Find usages
  • Find usages
  • Rename
  • Go to definition
  • Go to symbol
  • Go to file
  • Parameter name hints
  • Comment in/out
  • Postfix completion templates
  • Code formatter
  • Code intentions
  • Code inspections
  • Lua Standard Library/API
  • Luakit API
  • Luayoga API
  • Region folding
  • Lua Check Tool
  • More

    Any questions? Send an email to [email protected]




    鲜花

    握手

    雷人

    路过

    鸡蛋
    该文章已有0人参与评论

    请发表评论

    全部评论

    专题导读
    上一篇:
    kikito/tween.lua: Tweening/Easing/Interpolating functions for lua. Inspired on j ...发布时间:2022-08-16
    下一篇:
    Fengari发布时间:2022-08-16
    热门推荐
    阅读排行榜

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap